s3下载

news/2025/2/22 16:13:20/

s3断点下载

  1. 两个概念

    http request中的请求头有一个header为 range

    该字段表明请求的下载流从什么地方开始下载

    例如

    • RANGE: bytes=2000070-

    表明从2000070开始一直下载到最后

    • RANGE: bytes=2000070-2000080

      表明从2000070开始一直下载到2000080

    如果在请求时使用了range字段,那么在返回的response中会有多出一个header即

    Content-Range=bytes 100000-19999/20000

    表明你下载的返回是100000-19999,一共有20000字节,这个字段非常重要,服务器根据请求头的Content-Range来决定从文件流的哪个位置上开始读,并且需要返回状态码为206,表示部分请求成功,这些都是附加信息,告诉服务器需要怎样返回流

    response header属性详解

  2. 代码 (说明一下:此处的s3自动帮我们完成了响应的流的内容,因此我们不需要在response中进行header的设置)

    @ApiOperation("下载文件")
    @RequestMapping(value = "/downloadFile",method = RequestMethod.GET)
    public RestResult<?> downFile(@RequestParam(value="fileName")String fileName, String userId, String filePath) throws IOException {UserInfo userInfo = userInfoService.selectUserByUserId(userId);UserStorageInfo userStorageInfo = userStorageInfoService.selectUserStorageInfoByUserId(userId);if(userInfo!=null&&userStorageInfo!=null){return new RestResult<>(0,"用户信息不存在",null);}String bucket = userInfo.getBucket();AmazonS3 s3 = s3Client.getS3Client(new String(decoder.decode(userStorageInfo.getAk())),new String(decoder.decode(userStorageInfo.getSk())));GetObjectRequest request = new GetObjectRequest(bucket,fileName);//获取s3发送的请求if(request!=null){S3Object object = s3.getObject(request);//获取文件大小long fSize = object.getObjectMetadata().getContentLength();InputStream inputStream = null;long pos = 0;File file = new File(filePath+fileName);OutputStream out;if(file.exists()){pos = file.length();request.setRange(pos);//设置请求头中的range参数out = new FileOutputStream(file,true);//如果已经存在文件,已追加的形式添加数据}else {file.createNewFile();out = new FileOutputStream(file);}try {inputStream = object.getObjectContent();//获取上述range字段范围的文件流inputStream.skip(pos);byte[] buffer = new byte[1024*100]; //以10M的速度进行下载int length = 0;while ((length = inputStream.read(buffer, 0, buffer.length)) != -1) {out.write(buffer, 0, length);//                    Thread.sleep(100);  //调试的时候使用的}} catch (Exception e) {System.out.println("下载异常");}finally{try {if(null != out) out.flush();if(null != out) out.close();if(null != inputStream) inputStream.close();} catch (IOException e) {}}return new RestResult<>(0,file.length()==fSize?"下载完成":"下载未完成",file.length());}else {return new RestResult<>(0,"没有找到该文件",null);}
    }
    
  3. 如果说是一般的服务器的话,可以参考这篇博客


http://www.ppmy.cn/news/203483.html

相关文章

亚马逊S3的使用

一、下载s3browser客户端 1、进入下载页面进行下载 下载亚马逊S3客户端地址 2、使用客户端进行连接公司亚马逊服务 连接成功之后的界面如下: 可以一目了然的看到上传之后的文件和文件目录存储结构。 二、亚马逊 AmazonS3的使用 1、引入pom依赖 <dependency><gro…

夏普GP2Y1010AU0F灰尘传感器使用

夏普GP2Y1010AU0F灰尘传感器在STM32平台上的使用 一、传感器的概述 GP2Y1010AUOF是日本夏普公司开发的一款光学灰尘浓度检测传感器。此传感器内部成对角分布的红外发光二极管和光电晶体管&#xff0c;利用光敏原理来工作。用于检测特别细微的颗粒&#xff0c;如香烟颗粒、细微灰…

Amazon S3 功能介绍

Amazon S3 功能介绍 1 存储过程 创建用于存储数据元的桶&#xff0c;可以选择数据元所驻留的地区&#xff08;目前来说&#xff0c;选择东京、新加坡会快些&#xff0c;美国本土更便宜&#xff09;&#xff0c;上传数据元到桶&#xff0c;进行持久化存储。另外&#xff0c;可以…

spark对接aws s3以及兼容s3接口的对象存储

之前写了一篇如何让spark使用阿里云oss对象存储替代本地存储或者hdfs存储jar包&#xff0c;日志等&#xff0c;文章链接&#xff1a;spark对接oss对象存储 今天写一篇比较通用的&#xff0c;即spark对接aws s3或者其他厂商兼容s3接口的对象存储。 环境 spark环境&#xff1a;…

华为现在打败爱立信了么?

华为现在打败了爱立信了么&#xff1f; 我现在一直搞不明白华为是怎么打败爱立信的。 我刚问L一下同事&#xff0c;他们说华为是做手机的&#xff0c;没有电脑。 华为哪里有笔记本&#xff0c;又骗我 华为为啥要做笔记本电脑 华为成第二了&#xff0c;如果荣耀第一的话 华…

设计模式-责任链模式

责任链模式 问题背景解决方案&#xff1a;传统方法责任链模式基本介绍UML类图 解决方案&#xff1a;责任链模式UML类图代码示例 注意事项和细节 问题背景 学校OA系统采购审批项目&#xff1a;需求时 1&#xff09;采购员采购教学器材 2&#xff09;如果金额小于等于5000&#…

javaScript蓝桥杯-----芝麻开门

目录 一、介绍二、准备三、目标四、代码五、完成 一、介绍 在阿里巴巴和四十大盗的故事中&#xff0c;阿里巴巴因为无意中知道了开门的咒语人生发生了翻天覆地的变化&#xff0c;四十大盗也因为咒语的泄露最终丧命。芝麻开门的咒语作为重要的信息推动着故事的发展。下面由你来…

【深入浅出C#】章节 1:C#入门介绍:C#开发环境的设置和配置

一、环境准备 1.1 安装和配置.NET Core 当配置C#开发环境时&#xff0c;安装.NET Core是一个重要的步骤。以下是安装.NET Core的基本过程&#xff1a; 访问官方网站&#xff1a;打开浏览器&#xff0c;访问.NET Core的官方网站&#xff1a;https://dotnet.microsoft.com/en-u…