一.背景说明

  现在我做的系统中,需要有一个下载附件的功能,其实就是下载图片到本地中。相应的图片保存在多媒体系统中,我们只能拿到它的资源地址(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. 记一次GKCTF之旅

    GKCTF游记 昨天吧,去GKCTF玩了一下.题目很有意思,宝可梦也很好玩,我心情非常好,天台的风也很大...... 不多说了,把昨天认真看过的几道题记录总结一下.这里特别感谢出题的二进制师傅们,感谢 ...

  2. Java方法——递归

    递归(栈)  package method; ​ public class Demon04 {        //递归思想    public static void main(String[] ar ...

  3. LeetCode通关:哈希表六连,这个还真有点简单

    精品刷题路线参考: https://github.com/youngyangyang04/leetcode-master https://github.com/chefyuan/algorithm-b ...

  4. 搭建NFS文件共享

    1.概述: NFS(Network File System)意为网络文件系统,它最大的功能就是可以通过网络,让不同的机器不同的操作系统可以共享彼此的文件.简单的讲就是可以挂载远程主机的共享目录到本地, ...

  5. Spring Cloud Alibaba - SkyWalking

    SkyWalking 简介 分布式链路跟踪是分布式系统的应用程序性能监视工具,专为微服务.云原生架构和基于容器(Docker.K8s)架构而设计: 也就是说Skywalking是用于微服务的" ...

  6. cas5.3.1 从搭建到连接mysql(简而优美)

    前言: cas是单点登录服务框架,为单点登录业务提供了便捷服务,它分为client,server端,client端要聚合到我们自己的项目. server端要单独构建运行,本篇文章主要讲解一下cas5. ...

  7. JacksonUtils

    package com.intfish.resourceserver.util; import com.fasterxml.jackson.annotation.JsonInclude; import ...

  8. 活久见!TCP两次挥手,你见过吗?那四次握手呢?

    活久见!TCP两次挥手,你见过吗?那四次握手呢? 文章持续更新,可以微信搜一搜「小白debug」第一时间阅读,回复[教程]获golang免费视频教程.本文已经收录在GitHub https://git ...

  9. Slope Trick:解决一类凸代价函数DP优化

    [前言] 在补Codeforce的DP时遇到一个比较新颖的题,然后在知乎上刚好 hycc 桑也写了这道题的相关题解,这里是作为学习并引用博客的部分内容 这道题追根溯源发现2016年这个算法已经在API ...

  10. C# ThreadLocal源码追踪

    ThreadLocal 字段成员: private Func<T>? _valueFactory; 一个获取默认值的委托 不同线程共享此成员. [ThreadStatic] private ...