如何设计网站风格wordpress 绑定多个二级域名
2026/4/16 21:16:39 网站建设 项目流程
如何设计网站风格,wordpress 绑定多个二级域名,更换网站标题,南京做企业网站公司哪家好前言❝互联网的连接速度慢且不稳定#xff0c;有可能由于网络故障导致断开连接。在客户端下载一个大对象时#xff0c;因网络断开导致上传下载失败的概率就会变得不可忽视。❞图片客户端在GET对象请求时通过设置Range头部来告诉接口服务需要从什么位置开始输出对象的数据。判…前言❝互联网的连接速度慢且不稳定有可能由于网络故障导致断开连接。在客户端下载一个大对象时因网络断开导致上传下载失败的概率就会变得不可忽视。❞图片客户端在GET对象请求时通过设置Range头部来告诉接口服务需要从什么位置开始输出对象的数据。判断是否支持断点下载根据文档14.35.1 Byte Rangeshttps://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html// 直接判断是否有 Accept-Ranges bytes boolean support urlConnection.getHeaderField(Accept-Ranges).equals(bytes); System.out.println(Partial content retrieval support (support ? Yes : No));例如donalddonald-pro:~$ curl -i --range 0-9 http://localhost:8080/file/chunk/download HTTP/1.1 206 Accept-Ranges: bytes Content-Disposition: inline;filenamepom.xml Content-Range: bytes 0-9/13485 Content-Length: 10 Date: Mon, 01 Nov 2021 09:53:25 GMT直接判断头部HEAD例如❝HeadObject接口用于获取某个文件Object的元信息。使用此接口不会返回文件内容。❞HEAD /ObjectName HTTP/1.1 Host: BucketName.oss-cn-hangzhou.aliyuncs.com Date: GMT Date Authorization: SignatureValue需知对应HTTP状态码206 Partial ContentHTTP Range请求成功416 Requested Range Not Satisfiable statusHTTP Range请求超出界限200 OK不支持范围请求小结如下HTTP范围请求需要HTTP/1.1及之上支持如果双端某一段低于此版本则认为不支持。通过响应头中的Accept-Ranges来确定是否支持范围请求。通过在请求头中添加Range这个请求头来指定请求的内容实体的字节范围。在响应头中通过Content-Range来标识当前返回的内容实体范围并使用 Content-Length 来标识当前返回的内容实体范围长度。在请求过程中可以通过If-Range来区分资源文件是否变动它的值来自ETag或者Last-Modifled。如果资源文件有改动会重新走下载流程。生产实战开发也得依靠依据设定好边界才能掌控全局。有现成的文档来看阿里云文档https://help.aliyun.com/document_detail/39571.htmlRange: bytes0-499表示第0~499字节范围的内容。Range: bytes500-999表示第500~999字节范围的内容。Range: bytes-500表示最后500字节的内容。Range: bytes500-表示从第500字节开始到文件结束部分的内容。Range: bytes0-表示第一个字节到最后一个字节即完整的文件内容。HTTP Range是否合法对应处理如果HTTP Range请求合法响应返回值为 206 并在响应头中包含Content-Range如果HTTP Range请求不合法或者指定范围不在有效区间会导致Range不生效响应返回值为200并传送整个Object内容。❝如下为HTTP Range请求不合法的示例及错误说明: 假设Object资源大小为1000字节Range有效区间为0~999Range: byte0-499格式错误byte应为bytes。Range: bytes0-1000末字节1000超出有效区间。Range: bytes1000-2000指定范围超出有效区间。Range: bytes1000-首字节超出有效区间。Range: bytes-2000指定范围超出有效区间。❞举一些栗子# 正常范围下载 donalddonald-pro:~$ curl -i --range 0-9 http://localhost:8080/file/chunk/download HTTP/1.1 206 Accept-Ranges: bytes Content-Disposition: inline;filenameScreen_Recording_20211101-162729_Settings.mp4 Content-Range: bytes 0-9 Content-Type: application/force-download;charsetUTF-8 Content-Length: 16241985 Date: Wed, 03 Nov 2021 09:50:50 GMT服务端 - 业务开发这里以SpringBoot为栗子对外支持range下载底层存储使用cephController如下Slf4j RestController public class Controller { Autowired private FileService fileService; /** * 下载文件 * * 对外提供 * * param fileId 文件Id * param token token * param accountId 帐号Id * param response 响应 */ GetMapping(/oceanfile/download) public void downloadOceanfile(RequestParam String fileId, RequestHeader(value Range) String range, HttpServletResponse response) { this.fileService.downloadFile(fileId, response, range); } }Service如下Slf4j Service public class FileService { Autowired private CephUtils cephUtils; /** * 直接下载文件 * * Tips 支持断点下载 * param fileId 文件Id * param response 返回 * param range 范围 */ public void downloadFile(String fileId, HttpServletResponse response, String range) { // 根据 fileId 获取文件信息 FileInfo fileInfo getFileInfo(fileId); String bucketName fileInfo.getBucketName(); String relativePath fileInfo.getRelativePath(); // 处理 range范围信息 RangeDTO rangeInfo executeRangeInfo(range, fileInfo.getFileSize()); // rangeInfo null直接下载整个文件 if (Objects.isNull(rangeInfo)) { cephUtils.downloadFile(response, bucketName, relativePath); return; } // 下载部分文件 cephUtils.downloadFileWithRange(response, bucketName, relativePath, rangeInfo); } private RangeDTO executeRangeInfo(String range, Long fileSize) { if (StringUtils.isEmpty(range) || !range.contains(bytes) || !range.contains(-)) { return null; } long startByte 0; long endByte fileSize - 1; range range.substring(range.lastIndexOf() 1).trim(); String[] ranges range.split(-); if (ranges.length 0 || ranges.length 2) { return null; } try { if (ranges.length 1) { if (range.startsWith(-)) { //1. 如bytes-1024 从开始字节到第1024个字节的数据 endByte Long.parseLong(ranges[0]); } elseif (range.endsWith(-)) { //2. 如bytes1024- 第1024个字节到最后字节的数据 startByte Long.parseLong(ranges[0]); } } else { //3. 如bytes1024-2048 第1024个字节到2048个字节的数据 startByte Long.parseLong(ranges[0]); endByte Long.parseLong(ranges[1]); } } catch (NumberFormatException e) { startByte 0; endByte fileSize - 1; } if (startByte fileSize) { log.error(range error, startByte fileSize. startByte: {}, fileSize: {}, startByte, fileSize); return null; } return new RangeDTO(startByte, endByte); } }以上内容大家可以收藏起来如果以后遇到这样的场景分分钟搞定

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询