通过HttpURLConnection下载图片到本地(一)

一.背景说明

  现在我做的系统中,需要有一个下载附件的功能,其实就是下载图片到本地中。相应的图片保存在多媒体系统中,我们只能拿到它的资源地址(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;
    }
时间: 2024-10-27 02:02:29

通过HttpURLConnection下载图片到本地(一)的相关文章

通过scrapy内置的ImagePipeline下载图片到本地

1.通过scrapy内置的ImagePipeline下载图片到本地 1.通过scrapy内置的ImagePipeline下载图片到本地 1)在settings.py中打开 ITEM_PIPELINES 的注释,在  ITEM_PIPELINES 中加入 ITEM_PIPELINES = { 'spider_first.pipelines.SpiderFirstPipeline': 300, 'scrapy.pipelines.images.ImagesPipeline':5, #后面的数字代表执

Android使用HttpURLConnection下载图片

讲到http就必需要了解URI和URL URI (uniform resource identifier)统一资源标志符: URL(uniform resource location )统一资源定位符(或统一资源定位器): 可以理解成URL是URI的子集,URI是一抽象的标识符,URL可以理解成具体的标识符:只要是网络上的资源就能找到唯一的URL. 目录结构 效果图 关键代码 HttpUtils.java类 package com.dzt.downloadimage.utils; import

爬取今日头条历史图集将信息保存到MongDB,并且下载图片到本地

写在前面:学习<崔庆才_Python3爬虫入门到精通课程视频>动手写的小项目. (一) 分析页面 访问今日头条页面(https://www.toutiao.com/)在输入框中输入要搜索的关键字,搜索出的页面点击图集.要爬取的就是这里的所有图集. 查看页面的URL可以发现这是一个POST请求,然后我们就检查页面找到POST请求包,进行分析. 这个就是POST请求服务器返回的response 这是一个JSON格式的数据,复制下来放在解析器中查看.(使用jsonView) 可以看到data字段中的

七牛测试域名过期后批量下载图片到本地

在网上查询了一下,七牛云的网站上是不支持直接下载所有的图片的,需要借助他们的qshell工具来批量下载图片 文档在此: https://developer.qiniu.com/kodo/tools/1302/qshell 下载后解压,包含以下文件 1 2 3 4 5 6 7 8 9 10 [email protected]  /Users/jim/Downloads/qshell-v2.1.8   ll  18:13:40 total 99824 [email protected] 8

调起摄像头、上传下载图片、本地展示图片

之前那偏微信JS-SDK授权的文章实现了分享接口,那么这里总结一下如何在微信里面通过js调起原生摄像头,以及上传下载图片. 1.配置 页面引入通过jssdk授权后,传入wx对象,首先配置需要的接口 wx.config({ /* debug: true, */ appId: appid, timestamp: timestamp, nonceStr: nonceStr, signature: signature, jsApiList: [ 'chooseImage',//拍照或从手机相册中选图接口

利用Node 搭配uglify-js压缩js文件,批量下载图片到本地

Node的便民技巧-- 压缩代码 下载图片 压缩代码 相信很多前端的同学都会在上线前压缩JS代码,现在的Gulp Webpack Grunt......都能轻松实现.但问题来了,这些都不会,难道就要面对几十个JS文件一遍遍来回“复制-压缩-创建-粘贴”,这样太不人性化了. 于是可以借助Node + uglify-js 轻松实现.(前提你会点node操作) 1.首先看一下目录: |--uglifyJS |--js |--test1.js |--test2.js |--uglify.js   //这

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

刚从python3下载图片的语句python2的不太一样,具体python3语句如下: form urllib import request jpg_link = '......'  #图片链接 request.urlretrieve(jpg_link, path)  # path为路径加名字哦(如 ~/workjpg/111.jpg)!!!如果不需要路径,也要有个名字,如 111.jpg就直接保存在当前目录下 还可以这样写 import urllib.request jpg_link = '.

从阿里云下载图片到本地

下载图片 import java.io.BufferedInputStream;import java.io.File;import java.io.FileNotFoundException;import java.io.FileOutputStream;import java.io.IOException;import java.net.MalformedURLException;import java.net.URL; public static void main(String[] ar

php 远程下载图片到本地

大家好,从今天开始,小弟开始写写博客,把自己在工作中碰到的问题的解决方法纪录下来,方便以后查找,也给予别人方便,小弟不才,第一次写博客,有什么不足之处请指出,谢谢! 今天纪录的是怎么通过PHP远程把图片下载到本地,废话不多说,上代码. <?php/**功能:php完美实现下载远程图片保存到本地*参数:文件url,保存文件目录,保存文件名称,使用的下载方式*当保存文件名称为空时则使用远程文件原来的名称*/function getImage($url,$save_dir='',$filename='