根据URL下载文件/图片

ゝ一纸荒年。 2022-05-25 08:46 442阅读 0赞

根据URL下载文件、图片的方法

1、应用场景:远程文档服务器返回json结果,内容包括文件名称,文件路径,文件类型等信息,使用流(InputStream),通过文件路径去下载文件、图片。

远程文档服务器返回json结果如下图:

20180511112559427

2、应用方法:

  1. 先将返回的结果(代码中的fileData)进行转换为Map,获取其中keydata的数据,如文件名,文件路径信息,然后设置请求头信息,需设置:
  2. ContentType:multipart/form-data
  3. Content-Dispositionattachment; filename="xxx.xx"
  4. 然后根据文件路径创建URL对象,在根据URL对象打开输入流InputStream,然后在使用OutputStream流输出;

3、特别注意:

因为文件名称可能为中文,所以需要进行转码,否则会乱码,这里会将中文替换为下划线_ 如下图所示:

20180511113851941

  1. 这里要特别注意,文件名称编码格式不能使用UTF-8/GBK,需使用ISO-8859-1格式:
  2. new String(fileName.getBytes(),"iso-8859-1");

下载的方法代码如下:

  1. /**
  2. * 通过URL下载文件
  3. *
  4. * @param fileData
  5. * @throws IOException
  6. */
  7. public static void downloadWithUrl(String fileData, HttpServletResponse response) throws IOException {
  8. ObjectMapper om = new ObjectMapper();
  9. Map<String, Object> map = om.readValue(fileData, Map.class);
  10. Map<String, Object> data = ((List<Map<String, Object>>) map.get("data")).get(0);
  11. String fileName = (String) data.get("file_name");
  12. String path = (String) data.get("file_path");
  13. //设置响应参数
  14. response.setCharacterEncoding("UTF-8");
  15. response.setContentType("multipart/form-data");
  16. // response.setHeader("Content-Disposition", " attachment; filename=" + fileName);//使用此会导致中文变“_”下划线
  17. response.setHeader("Content-Disposition", " attachment; filename=" + new String(fileName.getBytes(), "iso-8859-1"));
  18. InputStream is = null;
  19. BufferedOutputStream outs = null;
  20. try {
  21. //创建数据流,执行下载
  22. URL url = new URL(path);
  23. is = url.openStream();
  24. outs = new BufferedOutputStream(response.getOutputStream());
  25. byte[] bytes = IOUtils.toByteArray(is);
  26. outs.write(bytes);
  27. } finally {
  28. if (null != outs)
  29. outs.close();
  30. if (null != is)
  31. is.close();
  32. }
  33. }

发表评论

表情:
评论列表 (有 0 条评论,442人围观)

还没有评论,来说两句吧...

相关阅读