javaWeb中文件的上传与下载及乱码问题解决

时间:2021-03-28 13:37:12
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
 <head>
    <title>文件上传页面</title>   
 </head>
 
  <body>
    <form action="${pageContext.request.contextPath }/servlet/UploadServlet" enctype="multipart/form-data" method="post">
        上传用户:<input type="text" name="username"><br/>    
        上传文件1:<input type="file" name="file1"><br/>    
        上传文件2:<input type="file" name="file2"><br/>
        
        <input type="submit" value="提交">    
    </form>
  </body>
</html>

//文件下载的后台servlet处理
package he.junhua.web.controller;

import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;

public class UploadServlet extends HttpServlet {

    public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {

        try {
            //1.得到解析器工厂
            DiskFileItemFactory factory = new DiskFileItemFactory();
            //2.得到解析器
            ServletFileUpload upload = new ServletFileUpload(factory);
            
            //3.判断上传表单的类型
            if (!upload.isMultipartContent(request)) {
                //上传表单为普通表单,则按照传统方式获取数据即可
                return;
            }
            
            //为上传表单,则调用解析器解析上传数据
            List<FileItem> list =    upload.parseRequest(request);
            
            for (FileItem item : list) {
                //如果是普通输入项,则得到输入项的名称和值        username="xxx"
                if(item.isFormField()){
                    String name =    item.getFieldName();
                    String value =    item.getString();
                    System.out.println(name+":"+value);
                }else{
                    //得到上传文件的文件名
                    String filename =    item.getName();
                    filename =    filename.substring(filename.lastIndexOf("\\")+1);
                    //得到上传数据
                    InputStream in =    item.getInputStream();
                    
                    int len=0;
                    byte buffer[] =    new byte[1024];
                    
                    //设置保存路径,注意安全问题,即保存路径不能被外界直接访问到
                    String savepath =    this.getServletContext().getRealPath("/WEB-INF/upload");
                    
                    //向保存路径中写入数据
                    FileOutputStream out =    new FileOutputStream(savepath+"\\"+filename);
                    while((len=in.read(buffer))>0){
                        out.write(buffer, 0, len);
                    }
                    
                    out.close();
                    in.close();
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        doGet(request, response);
    }

}

/*
文件下载
文件下载时要注意文件名为中文时产生乱码的问题,在网上查询得如下解决方案:
先在页面做下判断,判断是什么浏览器,然后传一个参数到servlet,进行用不同的编码方式。
//判断当前使用浏览器版本类
var SysBrowser = function(){
this.ua = navigator.userAgent.toLowerCase();
this.browserAndVersion;
this.verIE ;
this.verFirefox;
this.verChrome;
this.verOpera;
this.verSafari;
this.getBrowser = function(){
(this.browserAndVersion = this.ua.match(/msie ([\d.]+)/)) ? this.verIE = parseInt(this.browserAndVersion[1],10) :
    (this.browserAndVersion = this.ua.match(/firefox\/([\d.]+)/)) ? this.verFirefox = this.browserAndVersion[1] :
    (this.browserAndVersion = this.ua.match(/chrome\/([\d.]+)/)) ? this.verChrome = this.browserAndVersion[1] :
    (this.browserAndVersion = this.ua.match(/opera.([\d.]+)/)) ? this.verOpera = this.browserAndVersion[1] :
    (this.browserAndVersion = this.ua.match(/version\/([\d.]+).*safari/)) ? this.verSafari = this.browserAndVersion[1] : 0;
    //以下进行测试
    if (this.verIE) return "IE"+this.verIE;
    if (this.verFirefox) return "Firefox";
    if (this.verChrome) return "Chrome";
    if (this.verOpera) return "Opera";
    if (this.verSafari) return "Safari";
    }
};
// 设置Content-Disposition
String agent = request.getHeader("user-agent");
System.out.println(agent);
if (agent.contains("MSIE")) {
// IE浏览器 --- URL编码
filename = URLEncoder.encode(filename, "utf-8");
} else if (agent.contains("Firefox")) {
// 火狐浏览器 --- Base64编码
filename = base64EncodeFileName(filename);
} else {
filename = URLEncoder.encode(filename, "utf-8");
}
*/
package he.junhua.web.controller;

import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.URLEncoder;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class DownloadServlet extends HttpServlet {

    public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {

        String path =    this.getServletContext().getRealPath("/WEB-INF/upload/花菇.txt");
        String filename =    path.substring(path.lastIndexOf("\\")+1);
        
//        response.setHeader("content-disposition", "attachment;filename="+filename);
        response.setHeader("content-disposition", "attachment;filename="+URLEncoder.encode(filename,"utf-8"));
        
        InputStream in = null;
        OutputStream out = null;
        try {
            in = new FileInputStream(path);
            int len = 0;
            byte buffer[] = new byte[1024];
            out = response.getOutputStream();
            while ((len = in.read(buffer)) > 0) {
                out.write(buffer, 0, len);
            }
        } finally {
            if (in != null) {
                try {
                    in.close();
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
            if (out != null) {
                try {
                    out.close();
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }
    }

    public void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        doGet(request, response);
    }
}