一.背景说明

  现在我做的系统中,需要有一个下载附件的功能,其实就是下载图片到本地中。相应的图片保存在多媒体系统中,我们只能拿到它的资源地址(url),而不是真实的文件。

  这里记录的是下载单个图片。下篇文章中有介绍批量下载(下一篇文章)。

二.代码

1.html

/*
* 下载选中的附件
*/
$("#merchantApproval-annes-center-tb .downloadButton").click(function(){
//获取选中的行,此行包含了附件的相关信息
var row = $("#merchantApproval-annes-center-dg").datagrid("getSelected");
if(row){
//获取图片的资源地址
var imgUrl = $("#imageDivId>img").attr("src");
//向后台发送请求,参数是imgUrl和imgName
window.location="${ctx}/approvalImageHandle.do?method=downloadImage&imgUrl="+imgUrl+"&imgName="+row.annName;
}else{
//如果没有选中行,则提示用户
showTip("请选择一条记录进行操作!");
}
});

说明:我使用的是easyui框架,数据是用datagrid中获取的。

   前台请求请使用同步请求,不要使用ajax方式,否则response输出流会直接打印到浏览器后台中,而不会成为文件让用户下载。

2.Controller

  @RequestMapping(params = "method=downloadImage")
public void downloadImage(HttpServletRequest request, HttpServletResponse response) throws Exception{
//图片的名称
String imgName = request.getParameter("imgName");
//名称转码,避免中文乱码
imgName = new String(imgName.getBytes("iso8859-1"),"UTF-8");
//图片的资源地址,http://10.80.3.229:8081/mediaserver/574fe515e30ab97c9068d2e1
//这是媒体服务器返回的地址,因为是网络地址,所以需要使用HttpURLConnection去获取图片
String imgUrl = request.getParameter("imgUrl");
//输入流,用来读取图片
InputStream ins = null;
HttpURLConnection httpURL = null;
//输出流
OutputStream out = response.getOutputStream();
try{
URL url = new URL(imgUrl);
//打开一个网络连接
httpURL = (HttpURLConnection)url.openConnection();
//设置网络连接超时时间
httpURL.setConnectTimeout(3000);
//设置应用程序要从网络连接读取数据
httpURL.setDoInput(true);
//设置请求方式
httpURL.setRequestMethod("GET");
//获取请求返回码
int responseCode = httpURL.getResponseCode();
if(responseCode == 200){
//如果响应为“200”,表示成功响应,则返回一个输入流
ins = httpURL.getInputStream();
//设置response响应头
          //encodeChineseDownloadFileName()用来解决文件名为中文的问题,方法体在下面
response.setHeader("content-disposition", "attachment;filename="+ encodeChineseDownloadFileName(request,imgName));
//输出流到response中
byte[] data = new byte[1024];
int len = 0;
while((len = ins.read(data)) > 0){
out.write(data, 0, len);
}
}
}catch(Exception e){
LogUtil.ERROR.error("下载附件图片出错!",e);
}finally{
if(ins != null){
ins.close();
}
if(out != null){
out.close();
}
}
} /*
* 解决文件为中文名的乱码问题
*/
private String encodeChineseDownloadFileName(HttpServletRequest request, String pFileName) throws UnsupportedEncodingException{
String filename = null;
//获取请求头中的浏览器标识
String agent = request.getHeader("USER-AGENT");
if(agent != null){
if(agent.indexOf("Firefox") != -1){
//Firefox
filename = "=?UTF-8?B?" +
(new String(Base64.encodeBase64(pFileName.getBytes("UTF-8")))) + "?=";
}else if(agent.indexOf("Chrome") != -1){
//Chrome
filename = new String(pFileName.getBytes(), "ISO8859-1");
}else{
//IE7+
filename = URLEncoder.encode(pFileName, "UTF-8");
//替换空格
filename = StringUtils.replace(filename, "+", "%20");
}
}else{
filename = pFileName;
}
return filename;
}

通过HttpURLConnection下载图片到本地--下载附件的更多相关文章

  1. php下载图片到本地

    写了一天,就写了这么点代码,凑合用吧. #saveImage.php<?php /** * 图片下载方法,提供两种图片保存方式: * 1.按照图片自带的名称保存 * 2.按照自定义文件名保存 * ...

  2. 通过scrapy内置的ImagePipeline下载图片到本地、并提取本地保存地址

    1.通过scrapy内置的ImagePipeline下载图片到本地 2.获取图片保存本地的地址 1.通过scrapy内置的ImagePipeline下载图片到本地 1)在settings.py中打开  ...

  3. scrapy中的ImagePipeline下载图片到本地、并提取本地的保存地址

    通过scrapy内置到ImagePipeline下载图片到本地 在settings中打开 ITEM_PIPELINES的注释,并在这里面加入 'scrapy.pipelines.images.Imag ...

  4. 利用node来下载图片到本地

      本文是针对于知道图片地址的下载图片方法. 同时也是我的处男作(额,怪怪的〜);不要在意这些细节. 最近在弄项目迁移,需要把http的链接全换成https的:以前的cms不支持http的协议,然后就 ...

  5. URL地址下载图片到本地

    package test.dao; import eh.base.dao.DoctorDAO; import eh.entity.base.Doctor; import junit.framework ...

  6. python3 中自带urllib库可下载图片到本地

    刚从python3下载图片的语句python2的不太一样,具体python3语句如下: form urllib import request jpg_link = '......'  #图片链接 re ...

  7. java从网络中下载图片到本地

    public class imageDownload { public static void main(String[] args) { String url = "http://loca ...

  8. QT通过url下载图片到本地

    /* strUrl:下载图片时需要的url strFilePath:下载图片的位置(/home/XXX/YYY.png) */ void ThorPromote::downloadFileFromUr ...

  9. java根据图片的url地址下载图片到本地

    package com.daojia.haobo.aicircle.util; import sun.misc.BASE64Encoder; import java.io.*; import java ...

随机推荐

  1. 【Python机器学习实战】感知机和支持向量机学习笔记(三)之SVM的实现

    前面已经对感知机和SVM进行了简要的概述,本节是SVM算法的实现过程用于辅助理解SVM算法的具体内容,然后借助sklearn对SVM工具包进行实现. SVM算法的核心是SMO算法的实现,首先对SMO算 ...

  2. Docker部署Zookeeper部署实践(1)

    Zookeeper可提供的服务主要有:配置服务.名字服务.分布式同步.组服务等 1. 抓取Zookeeper镜像 命令:docker pull zookeeper 2. 将Zookeeper镜像保存为 ...

  3. iOS开发之转盘菜单

    前言 使用Swift实现的转盘菜单,主要用到UIBezierPath.CALayer遮罩绘制扇形UIView,CATransform3DMakeRotation实现旋转动画.代码设计使用默认confi ...

  4. python爬虫:了解JS加密爬取网易云音乐

    python爬虫:了解JS加密爬取网易云音乐 前言 大家好,我是"持之以恒_liu",之所以起这个名字,就是希望我自己无论做什么事,只要一开始选择了,那么就要坚持到底,不管结果如何 ...

  5. 【网络编程】TCPIP-5-UDP

    目录 前言 5. UDP 网络编程 5.1 UDP 的工作原理 5.2 UDP 的高效性 5.3 实现 UDP 服务端/客户端 5.3.1 概念 5.3.2 UDP 的数据 I/O 函数 5.3.3 ...

  6. [源码解析] 深度学习流水线并行Gpipe(1)---流水线基本实现

    [源码解析] 深度学习流水线并行Gpipe(1)---流水线基本实现 目录 [源码解析] 深度学习流水线并行Gpipe(1)---流水线基本实现 0x00 摘要 0x01 概述 1.1 什么是GPip ...

  7. 解决Git中fatal: refusing to merge unrelated histories

    原文链接: https://blog.csdn.net/wd2014610/article/details/80854807 Git的报错 在使用Git的过程中有时会出现一些问题,那么在解决了每个问题 ...

  8. @NotNull-JSR-303验证

    背景 Spring Boot 引入Hibernate Validator 机制来支持 JSR-303 验证规范 实现 请求参数model类: package com.wzq.test.model; i ...

  9. springboot分页插件的使用

    在springboot工程下的pom.xml中添加依赖 <!--分页 pagehelper --> <dependency> <groupId>com.github ...

  10. .net core signalR 服务端强制中断用户连接

    .net core signalR 服务端断开连接 { } { } *:first-child { } *:last-child { } { } { } { } { } { } { } { } { } ...