zoukankan      html  css  js  c++  java
  • jsp 文件下载

    引用:http://hi.baidu.com/qq_java_liu/item/399e63d6802c5b866cce3f48

    1.最直接最简单的,方式是把文件地址直接放到html页面的一个链接中。这样做的缺点是把文件在服务器上的路径暴露了,并且还无法对文件下载进行其它的控制(如权限)。这个就不写示例了。

    2.在服务器端把文件转换成输出流,写入到response,以response把文件带到浏览器,由浏览器来提示用户是否愿意保存文件到本地。(示例如下)


    <%
    response.setContentType(fileminitype);
    response.setHeader("Location",filename);
    response.setHeader("Cache-Control", "max-age=" + cacheTime);
         //filename应该是编码后的(utf-8)
    response.setHeader("Content-Disposition", "attachment; filename=" + filename); 
    response.setContentLength(filelength);
    OutputStream outputStream = response.getOutputStream();
    InputStream inputStream = new FileInputStream(filepath);
    byte[] buffer = new byte[1024];
    int i = -1;
    while ((i = inputStream.read(buffer)) != -1) {
    outputStream.write(buffer, 0, i);
    }
    outputStream.flush();
    outputStream.close();
    inputStream.close();
    outputStream = null;
    %>

      3.既然是JSP的话,还有一种方式就是用Applet来实现文件的下载。不过客户首先得信任你的这个Applet小程序,由这个程序来接受由servlet发送来的数据流,并写入到本地。

      servlet端示例


    public void service(HttpServletRequest req, HttpServletResponse res)
                throws ServletException, IOException {
            res.setContentType(" text/plain ");
            OutputStream outputStream = null;
            try {
                outputStream = res.getOutputStream();
                //把文件路径为srcFile的文件写入outputStream中
                popFile(srcFile, outputStream)) ;
            } catch (IOException e) {
                e.printStackTrace();    
         }
              }


    JApplet端示例

    URLConnection con;
            try {
                //url是被调用的SERVLET的网址 如 *.do 
                con = url.openConnection();

    con.setUseCaches(false);
                con.setDoInput(true);
                con.setDoOutput(true);
                con.setRequestProperty("Content-Type",
                    "application/octet-stream");
                InputStream in = con.getInputStream();
                ProgressMonitorInputStream pmInputStream = new ProgressMonitorInputStream
    (pane, "正在从服务器下载文件内容", in);
                ProgressMonitor pMonitor = pmInputStream.getProgressMonitor();
                pMonitor.setMillisToDecideToPopup(3);
                pMonitor.setMillisToPopup(3);
                //localfilepath本地路径,localstr文件文件夹,filename本地文件名
                String localfilepath = localstr + filename ;
                //方法saveFilsaveFilee是把输入流pmInputStream写到文件localfilepath中 
                if(saveFilsaveFilee(localfilepath,pmInputStream)){
                openLocalFile(localfilepath);
                      }

      4.顺便把JApplet上传文件的代码也贴上来.


    JApplet端示例


    URLConnection con;
            try {
                con = url.openConnection();
                //url是被调用的SERVLET的网址 如 *.do         
              con.setUseCaches(false);
                con.setDoInput(true);
                con.setDoOutput(true);
                con.setRequestProperty("Content-Type","application/octet-stream"); 
    OutputStream out = con.getOutputStream();
                //localfilepath本地路径,localstr文件文件夹,filename本地文件名
                String localfilepath = localstr + filename;
                //文件getOutputStream是把文件localfilepath写到输出流out中
                getOutputStream(localfilepath,out);
                InputStream in = con.getInputStream();
                return true;
            }catch (IOException e) {
                   System.out.println("文件上传出错!");
                e.printStackTrace();
                  }

      servlet端代码示例

    public void service(HttpServletRequest req, HttpServletResponse res)
               throws ServletException, IOException {
            res.setContentType(" text/plain ");
            InputStream inputStream = null;
            try {
                inputStream = res.getInputStream();
    //把输入流inputStream保存到文件路径为srcFile的文件中
                writefile(srcFile, inputStream);
            } catch (IOException e) {
                e.printStackTrace();
            }
              } // end service

      总结:在文件的传输中是流的形式存在的,在硬盘上是文件的形式存在的。我们要做的只是通过HttpServletRequest和HttpServletResponse,或者是response和request来发送流和读取流。以及把文件转换成流或把流转换成文件的操作。

    乱码处理的文件下载:

    原创:

    <%@ page language="java" pageEncoding="UTF-8"%>
    < import="java.io.*" %>
    < import="java.net.URLEncoder"%>
    <%

    request.setCharacterEncoding("gb2312");
    response.setCharacterEncoding("gb2312");

    String filename="图片.jpg";
    String filepath="e:/图片.jpg";

    if (request.getHeader("User-Agent").toLowerCase().indexOf("firefox") > 0)
        filename = new String(filename.getBytes("UTF-8"), "ISO8859-1");//firefox浏览器
    else 
         if (request.getHeader("User-Agent").toUpperCase().indexOf("MSIE") > 0)
              filename = URLEncoder.encode(filename, "UTF-8");//IE浏览器
        
    response.setContentType("text/plain");
    response.setHeader("Location",filename);
    response.reset();
    response.setHeader("Cache-Control", "max-age=0" );
    response.setHeader("Content-Disposition", "attachment; filename=" + filename);

    /*如果有换行,对于文本文件没有什么问题,但是对于其它格
    式,比如AutoCAD、Word、Excel等文件下载下来的文件中就会多出一些换行符//0x0d和0x0a,这样可能导致某些格式的文件无法打开,有些也可以正常打开。同//时response.reset()这种方式也能清空缓冲区, 防止页面中的空行等输出到下载内容里去*/

    OutputStream outputStream = response.getOutputStream();
    InputStream inputStream = new FileInputStream(filepath);

    byte[] buffer = new byte[1024];
    int i = -1;
    while ((i = inputStream.read(buffer)) != -1) {
    outputStream.write(buffer, 0, i);
    }
    outputStream.flush();
    outputStream.close();
    inputStream.close();
    outputStream = null;

    //下载时抛出异常

    out.clear();
    out=pageContext.pushBody();
    %>

  • 相关阅读:
    Lombok介绍、使用方法和总结
    Vargant centOS7安装
    Nginx
    Docker
    GOPATH
    Golang http
    /^正则表达式$/
    go: missing Git command. See https://golang.org/s/gogetcmd
    Golang 反射
    Golang 常量
  • 原文地址:https://www.cnblogs.com/sode/p/2796399.html
Copyright © 2011-2022 走看看