(直接下载url文件)使用Apache Httpclient访问Spring rest接口下载文件

参考http://blog.csdn.net/tangyajun_168/article/details/53647902

1.编写Spring rest接口,该接口将文件读入到流中并通过ResponseEntity对象返回

@RequestMapping(value="/file",method=RequestMethod.GET)
public ResponseEntity<InputStreamResource> getFile(@RequestParam Integer id){
    //设置response返回头部信息
    HttpHeaders headers = new HttpHeaders();
    headers.add("Cache-Control", "no-cache, no-store, must-   revalidate");
    headers.add("Pragma", "no-cache");
    headers.add("Expires", "0");
    FileInputStream input=null;
    File file=null;
    long len=0l;
    try {
    //通过主键ID获取文件对象
            FileData data=fileMapper.selectByPrimaryKey(id);
            //获取文件存储的路径
            String filePath=data.getFilePath();
            //通过Paths获取文件
            file=Paths.get(filePath).toFile();
            input=new FileInputStream(file);
            len=file.length();
        } catch (Exception e) {
            e.printStackTrace();
        }
        //设置返回实体的头部、长度及类型
        return ResponseEntity
                .ok()
                .headers(headers)
                .contentLength(len)
                .contentType(MediaType.parseMediaType("application/octet-stream"))
                .body(new InputStreamResource(input));

}

2.应用二使用httpclient发送请求获取文件流,然后将文件流写入到文件中实现文件下载功能

@RequestMapping(value="/file/download/{id}",method=RequestMethod.GET)
public OperationResult downloadFile(@PathVariable(value="id") Integer id,
HttpServletResponse response){
//根据主键ID从数据库中查询文件信息
Map<String,Object> originalDataMap=fileMapper.findFileByPrimaryKey(id);
//获取文件的名称(包含后缀)
String oldFileName=String.valueOf(originalDataMap.get("original_title"));
byte[] buffer= new byte[1024];
        //char[] buffer= new char[1024];
        int len=-1;
        //创建httpClient客户端
        CloseableHttpClient httpClient=HttpClients.createDefault();
        //创建httpGet发送请求获取文件
        HttpGet httpGet=new HttpGet("http://localhost:8080/test?id="+id);
        //将文件读入到输入流中
        try(CloseableHttpResponse httpResponse=httpClient.execute(httpGet);
                InputStream input=httpResponse.getEntity().getContent();
                OutputStream output=response.getOutputStream();
                ){
            //设置响应头
            response.setHeader("content-disposition", "attachment;filename="+URLEncoder.encode(oldFileName, "UTF-8"));       //从输入流中读取文件
            while((len=input.read(buffer))!=-1){
                //将buffer数组写入到文件中,从0开始写入的长度为实际读取到的长度len,如果使用write(buffer);会出现中文乱码及图像变模糊的问题
                output.write(buffer,0,len);
            }

        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
}
  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
提供的源码资源涵盖了Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 适合毕业设计、课程设计作业。这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。 所有源码均经过严格测试,可以直接运行,可以放心下载使用。有任何使用问题欢迎随时与博主沟通,第一时间进行解答!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值