java下载url图片链接

ゞ 浴缸里的玫瑰 2022-06-10 04:24 328阅读 0赞

1.从之前写的一篇中改写了代码,从远程的url链接中下载图片,并对各种浏览器的中文文件名进行展示

  1. /**
  2. * 根据url路径下载图片
  3. * @param filename 处理下载时显示设置好的中文名 eg:张三的照片.jpg
  4. * @param path 要保存在本地的临时路径(下载之后会将保存在此处的图片删除)eg: d:/image
  5. * @param url 图片链接 eg: http://photo.baidu.com/111.jpg
  6. * @param request
  7. * @param response
  8. */
  9. public static void downloadFileFromImageServer(String filename, String path, String url, HttpServletRequest request, HttpServletResponse response) {
  10. try {
  11. // 1.得到下载文件的名称.必须处理乱码.
  12. filename = GetEncode.transcode(filename);
  13. // 2.从upload目录下查找filename文件是否存在。
  14. URL httpurl = new URL(url);
  15. String fileName = IDUtil.getUUID() + url.substring(url.lastIndexOf("."));
  16. File file = new File(path + fileName);
  17. FileUtils.copyURLToFile(httpurl, file);
  18. // 下载设置
  19. // 1.设置mimetype类型
  20. String mimeType = new MimetypesFileTypeMap().getContentType(file);
  21. response.setContentType(mimeType); // 根据文件名获取这种文件的mimeType值,设置到http响应头中。
  22. // 以下代码解决了浏览器显示下载文件名乱码问题
  23. String agent = request.getHeader("User-agent");
  24. String viewfilename = null;
  25. if (agent.contains("MSIE")) {
  26. // IE浏览器
  27. viewfilename = URLEncoder.encode(filename, "utf-8");
  28. } else if (agent.contains("Firefox")) {
  29. // 火狐浏览器
  30. BASE64Encoder base64Encoder = new BASE64Encoder();
  31. viewfilename = "=?utf-8?B?"
  32. + base64Encoder.encode(filename.getBytes("utf-8")) + "?=";
  33. } else if (agent.contains("Chrome")) {
  34. // google浏览器
  35. viewfilename = URLEncoder.encode(filename, "utf-8");
  36. } else {
  37. // 其它浏览器
  38. viewfilename = URLEncoder.encode(filename, "utf-8");
  39. }
  40. // 2.设置响应头 Content-Dispositon.
  41. response.setHeader("Content-Disposition", "attachment;filename="
  42. + viewfilename);
  43. if (file.exists()) {
  44. // 存在
  45. // 3.通过输入流将这个文件内容读取出来,通过response获取输出流,写回到浏览器.
  46. FileInputStream fis = new FileInputStream(file);
  47. OutputStream os = response.getOutputStream();
  48. int len = -1;
  49. byte[] b = new byte[1024];
  50. while ((len = fis.read(b)) != -1) {
  51. os.write(b, 0, len);
  52. os.flush();
  53. }
  54. try {
  55. fis.close();
  56. os.close();
  57. file.delete();
  58. }
  59. catch (IOException e1) {
  60. e1.printStackTrace();
  61. }
  62. } else {
  63. // 不存在
  64. throw new RuntimeException("下载资源不存在");
  65. }
  66. }
  67. catch (UnsupportedEncodingException e) {
  68. e.printStackTrace();
  69. throw new RuntimeException("下载资源名称转码异常");
  70. }
  71. catch (FileNotFoundException e) {
  72. e.printStackTrace();
  73. throw new RuntimeException("下载资源不存在");
  74. }
  75. catch (IOException e) {
  76. e.printStackTrace();
  77. throw new RuntimeException("下载资源流异常");
  78. }
  79. }

2.用到的转码工具类

  1. import java.io.UnsupportedEncodingException;
  2. /**
  3. * 编码解码工具类
  4. * @author wugang
  5. *
  6. */
  7. public class GetEncode {
  8. public static String transcode(String str, String sourceCharset, String targetCharset){
  9. if (str == null)
  10. return null;
  11. String retStr = str;
  12. byte b[];
  13. try{
  14. b = str.getBytes(sourceCharset);
  15. for(int i=0; i < b.length; i++){
  16. byte b1 = b[i];
  17. if(b1 == 63)
  18. break;
  19. else if(b1 > 0)
  20. continue;
  21. else if(b1 < 0){
  22. retStr = new String(b, targetCharset);
  23. break;
  24. }
  25. }
  26. b = retStr.getBytes();
  27. }catch(UnsupportedEncodingException e){
  28. e.printStackTrace();
  29. }
  30. return retStr;
  31. }
  32. /**
  33. * 将字符串先按ISO8859-1解码,再按UTF-8编码
  34. * @param str
  35. * @return
  36. */
  37. public static String transcode(String str){
  38. if(str == null || "".equals(str.trim()))
  39. return "";
  40. return transcode(str,"ISO8859-1", "UTF-8");
  41. }
  42. }

发表评论

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

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

相关阅读

    相关 URL

    URL和URI URL和URLConnection类封装了大量复杂的实现细节,这些细节涉及如何从远程站点获取信息。例如,可以通过传递字符串来构建一个URL对象 :