你好,欢迎访问我的博客!登录
当前位置:首页 - 技术 - 正文 君子好学,自强不息!

多种方式实现java下载文件功能

2018-06-22 17:15:08技术admin51°c
A+ A-

java下载文件

  文件上传和下载是java web中常见的操作,文件上传主要是将文件通过IO流传放到服务器的某一个特定的文件夹下,而文件下载则是与文件上传相反,将文件从服务器的特定的文件夹下的文件通过IO流下载到本地。本文通过实例代码给大家介绍了java从网上下载文件的几种方式,非常不错,具有参考借鉴价值,需要的的朋友参考下吧

多个文件下载的情况

开始想使用response进行多个文件的下载,在后端处理,结果无法实现。

坑一:一个request只能返回对应的一个response

因此,无法把多个文件使用response对象进行下载。如果不关闭ops,强行输出到一个文件中,则文件会不可读。使用Excel恢复可读,也只有第一个文件存在。

后来就想尝试发送多个请求,就使用Ajax尝试多次发送请求。

坑二:不能使用Ajax请求下载文件

因为Ajax的返回类型是json、text、html、xml等类型,不是流类型,所以无法实现文件下载。

所以,只能使用隐藏表单或者iframe的方法。

隐藏表单方法:

jQuery('<form action="'+url+'" method="post">' +   

    '<input type="text" name="filename" value="'+filename+'"/>' +   

    '<input type="text" name="filetype" value="'+filetype+'"/>' +   

    '</form>').appendTo('body').submit();  

存在的问题是提交时会全部加到一起,只提交一次。

最终解决方法:

页面添加多个隐藏iframe,循环设置src,分别load

Ajax请求实现文件下载方法

1、使用隐藏表单,提交隐藏表单

2、使用window.open()或window.location.href()方法

3、使用隐藏iframe,src指向后端需要的地址

Ajax无法进行文件下载,但仍可以获得文件内容,文件将被保留在内存中,无法保存到磁盘。因为JavaScript无法与磁盘进行交互,js无法调用到浏览器的下载处理机制和程序,会被浏览器阻塞。

response的getWriter()方法在连续输出两次流到页面的时候,第二次的流会包括第一次的流,所以需用response.reset()或response.resetBuffer()方法来重置

response.reset()

Clears any data that exists in the buffer as well as the status code and headers. If the response has been committed, this method throws an IllegalStateException.

response.reset()的使用有一个条件受限:response的任何打开流关闭之后都不能再reset

resetBuffer()

Clears the content of the underlying buffer in the response without clearing headers or status code. If the response has been committed, this method throws an

IllegalStateException

可以看到resetBuffer方法与reset方法的区别是,头和状态码没有清除

以流的方式下载.


  public HttpServletResponse download(String path, HttpServletResponse response) {        try {            // path是指欲下载的文件的路径。
            File file = new File(path);            // 取得文件名。
            String filename = file.getName();            // 取得文件的后缀名。
            String ext = filename.substring(filename.lastIndexOf(".") + 1).toUpperCase();            // 以流的形式下载文件。
            InputStream fis = new BufferedInputStream(new FileInputStream(path));            byte[] buffer = new byte[fis.available()];
            fis.read(buffer);
            fis.close();            // 清空response            response.reset();            // 设置response的Header
            response.addHeader("Content-Disposition", "attachment;filename=" + new String(filename.getBytes()));
            response.addHeader("Content-Length", "" + file.length());
            OutputStream toClient = new BufferedOutputStream(response.getOutputStream());
            response.setContentType("application/octet-stream");
            toClient.write(buffer);
            toClient.flush();
            toClient.close();
        } catch (IOException ex) {
            ex.printStackTrace();
        }        return response;
    }

下载本地文件


  public void downloadLocal(HttpServletResponse response) throws FileNotFoundException {        // 下载本地文件
        String fileName = "Operator.doc".toString(); // 文件的默认保存名        // 读到流中
        InputStream inStream = new FileInputStream("c:/Operator.doc");// 文件的存放路径        // 设置输出的格式        response.reset();
        response.setContentType("bin");
        response.addHeader("Content-Disposition", "attachment; filename=\"" + fileName + "\"");        // 循环取出流中的数据
        byte[] b = new byte[100];        int len;        try {            while ((len = inStream.read(b)) > 0)
                response.getOutputStream().write(b, 0, len);
            inStream.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

下载网络文件

   public void downloadNet(HttpServletResponse response) throws MalformedURLException {        // 下载网络文件
        int bytesum = 0;        int byteread = 0;
        URL url = new URL("windine.blogdriver.com/logo.gif");        try {
            URLConnection conn = url.openConnection();
            InputStream inStream = conn.getInputStream();
            FileOutputStream fs = new FileOutputStream("c:/abc.gif");            byte[] buffer = new byte[1204];            int length;            while ((byteread = inStream.read(buffer)) != -1) {
                bytesum += byteread;
                System.out.println(bytesum);
                fs.write(buffer, 0, byteread);
            }
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

支持在线打开的方式


  public void downLoad(String filePath, HttpServletResponse response, boolean isOnLine) throws Exception {
        File f = new File(filePath);        if (!f.exists()) {
            response.sendError(404, "File not found!");            return;
        }
        BufferedInputStream br = new BufferedInputStream(new FileInputStream(f));        byte[] buf = new byte[1024];        int len = 0;
        response.reset(); // 非常重要
        if (isOnLine) { // 在线打开方式
            URL u = new URL("file:///" + filePath);
            response.setContentType(u.openConnection().getContentType());
            response.setHeader("Content-Disposition", "inline; filename=" + f.getName());            // 文件名应该编码成UTF-8
        } else { // 纯下载方式
            response.setContentType("application/x-msdownload");
            response.setHeader("Content-Disposition", "attachment; filename=" + f.getName());
        }
        OutputStream out = response.getOutputStream();        while ((len = br.read(buf)) > 0)
            out.write(buf, 0, len);
        br.close();
        out.close();
    }
  选择打赏方式
微信赞助

打赏

QQ钱包

打赏

支付宝赞助

打赏

  选择分享方式
  移步手机端
多种方式实现java下载文件功能

1、打开你手机的二维码扫描APP
2、扫描左则的二维码
3、点击扫描获得的网址
4、可以在手机端阅读此文章
标签:

发表评论

选填

必填

必填

选填

请拖动滑块解锁
>>


  用户登录