您的位置:首页 > 编程语言 > Java开发

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

2015-03-23 14:51 288 查看
文章新地址:http://blog.csdn.net/greenlight_74110/article/details/78355111

<%@ 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);

    }

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: