zoukankan      html  css  js  c++  java
  • java开发在线下载功能,自动打开浏览器下载功能下载网络文件或图片

    因为业务的需要,公司产品要求商品详情页面有个下载的功能

    找了很多的方法,发现有的需要打开一个新窗口,而且在某些浏览器上不适用,所以继续寻找更好的方法

    跟同事沟通后发现他那里有个下载的方法,不过是C#写的,改了改发现有些地方不太通用,所以继续百度。

    后来找到一段可以用的代码,用了自己的前端js代码,加上百度的java代码修改后,发现可以达到自己的需求

    于是,更新博客,留作以后使用。

    本套代码示例基于springMVC 开发;

    Java代码如下:

    1.首先编写cotroller进行调用;

    1 @RequestMapping(value="downLoadFromUrl")
    2     public void  downLoadFromUrl(HttpServletRequest request,HttpServletResponse response) throws IOException{  
    3         DownloadUtils.downLoadFromUrl(request, response);
    4     }

    2.下载功能的实现代码DownloadUtils;

    package com.utils;
    
    import java.io.ByteArrayOutputStream;
    import java.io.FileNotFoundException;
    import java.io.IOException;
    import java.io.InputStream;
    import java.io.OutputStream;
    import java.net.HttpURLConnection;
    import java.net.URL;
    
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    /**
     * 在线下载图片功能*/
    public class DownloadUtils {
        public static void  downLoadFromUrl(HttpServletRequest request,HttpServletResponse response) throws IOException{  
            String downloadUrl = request.getParameter("fileName");
            URL url = new URL(downloadUrl);    
            HttpURLConnection conn = (HttpURLConnection)url.openConnection();    
                    //设置超时间为3秒  
            conn.setConnectTimeout(3*1000);  
            //防止屏蔽程序抓取而返回403错误  
            conn.setRequestProperty("User-Agent", "Mozilla/4.0 (compatible; MSIE 5.0; Windows NT; DigExt)");  
            //得到输入流  
            InputStream inputStream = conn.getInputStream();  
            try {
                String[] fileNameParts = downloadUrl.split("/");
                String fileName = fileNameParts[fileNameParts.length - 1];
    //            String fileName = "aaa.jpg";
                fileName = new String(fileName.getBytes("UTF-8"),"ISO8859-1");
                response.setContentType("application/octet-stream");
                response.addHeader("Content-Disposition", "attachment;filename="+fileName);
                String len = String.valueOf(inputStream.available()/1000+"k");
                response.setHeader("Content-Length", len);
                OutputStream out = response.getOutputStream();
                byte[] getData = readInputStream(inputStream);      
                out.write(getData);
                inputStream.close();
                out.close();
            } catch (FileNotFoundException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
            
        
        /** 
         * 从输入流中获取字节数组 
         * @param inputStream 
         * @return 
         * @throws IOException 
         */  
        public static  byte[] readInputStream(InputStream inputStream) throws IOException {    
            byte[] buffer = new byte[1024];    
            int len = 0;    
            ByteArrayOutputStream bos = new ByteArrayOutputStream();    
            while((len = inputStream.read(buffer)) != -1) {    
                bos.write(buffer, 0, len);    
            }    
            bos.close();    
            return bos.toByteArray();    
        }  
    }

    3.js代码如下;

    function downloadFile() {
        var pic=$("input[name='pic']
        window.location = "/product_big/downLoadFromUrl?fileName="+pic;
    }

     最后感谢万能的百度

    下面这个是打包下载文件的java代码,上面的是直接下载图片的,下面这个可以实现批量打包下载

    @RequestMapping(value = "/downLoadImage", method = RequestMethod.GET)
        public void downLoadImage(HttpServletRequest request, HttpServletResponse response) throws Exception {
            List<String> urls = Lists.newArrayList();
            String path = request.getParameter("pictureUrl");
            urls.add(path);
            Map<String, InputStream> isMap = Maps.newHashMap();
            for (String urlStr : urls) {
                String[] fileNameParts = urlStr.split("/");
                String fileName = fileNameParts[fileNameParts.length - 1];
                try {
                    URL url = new URL(urlStr);
                    URLConnection con = url.openConnection();
                    // 设置超时间为3秒
                    con.setConnectTimeout(3 * 1000);
                    // 防止屏蔽程序抓取而返回403错误
                    con.setRequestProperty("User-Agent", "Mozilla/4.0 (compatible; MSIE 5.0; Windows NT; DigExt)");
                    InputStream is = con.getInputStream();
                    isMap.put(fileName, is);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
            String[] fileNameParts = path.split("/");
            String fileNames = fileNameParts[fileNameParts.length - 1];
            response.setContentType("application/octet-stream");
            String filename = URLEncoder.encode(fileNames, "UTF-8");
            response.setHeader("Content-Disposition", "attachment; filename=" + filename + ".zip");
            ZipOutputStream zipOut = new ZipOutputStream(response.getOutputStream());
            for (Entry<String, InputStream> is : isMap.entrySet()) {
                String fileName = is.getKey();
                InputStream value = is.getValue();
                try {
                    addToZip(value, zipOut, fileName);
                    
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
            zipOut.flush();
            zipOut.close();
    
        }
     
        private void addToZip(InputStream is,ZipOutputStream zipOut, String fileName) throws IOException {
            fileName = URLEncoder.encode(fileName, "UTF-8");
            ZipEntry entry = new ZipEntry(fileName);
            zipOut.putNextEntry(entry);
            int len;
            byte[] buffer = new byte[1024];
            while ((len = is.read(buffer)) > 0) {
                
                zipOut.write(buffer, 0, len);
            }
            zipOut.closeEntry();
            is.close();
        }
  • 相关阅读:
    Jmeter压测
    .NET .Core 选择日志框架
    边缘控制器在边缘计算中的作用
    为何选择NB-IOT,NB-IOT的特点是什么
    RS232协议是什么
    物联网在生活中的应用场景
    透传模块是什么 为何透传
    4G DTU相对于GPRS/3G DTU有什么优势
    MQTT协议和Modbus之间的区别是什么
    4G模块应该怎么选择
  • 原文地址:https://www.cnblogs.com/itworkers/p/9473658.html
Copyright © 2011-2022 走看看