JavaEE上传和下载

来源:互联网 发布:淘宝冷光美白仪有用么 编辑:程序博客网 时间:2024/06/05 10:46

先导jar包


上传:

import java.io.File;
import java.io.IOException;
import java.util.List;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebInitParam;
import javax.servlet.annotation.WebServlet;
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;

@WebServlet(value="/upload",initParams={@WebInitParam(name="path",value="/upload")})
public class UpLoadServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;
    private String path;
    
    @Override
    public void init() throws ServletException {
        //在web.xml中把path值传过来或者使用注解 例如:
        /*
         *  <init-param>
           *        <param-name>path</param-name>
         *         <param-value>/upload</param-value>
         *     </init-param>
         *
         */
        path = getServletConfig().getInitParameter("path");
    }
    
    
    @SuppressWarnings("unchecked")
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        
        String username = request.getParameter("username");
        //页面表单中设置了enctype="multipart/form-data"后
        //无法直接通过getParameter方法获取普通组件的参数值
        System.out.println("getParameter username = "+username);
        
        //获得上传目录的绝对路径
        String realpath = getServletContext().getRealPath(path);
        
        try {
            //构造一个文件上传处理对象
            DiskFileItemFactory factory = new DiskFileItemFactory();
            ServletFileUpload upLoad = new ServletFileUpload(factory);
            
            //获得表单中提交内容
            List<FileItem> list = upLoad.parseRequest(request);

            for (FileItem fileItem : list) {
                //fileItem.isFormField()返回true表示是普通的表单组件
                //fileItem.isFormField()返回false表示是上传输入框
                if (fileItem.isFormField()) {
                    //getFieldName()方法获得普通表单组件的参数名
                    String FieldName = fileItem.getFieldName();
                    //获得该参数所对应的值并指定编码
                    String Content = fileItem.getString("UTF-8");
                    //为了后面可以把普通参数从request中拿出来
                    request.setAttribute(FieldName, Content);
                } else {
                    //getName()取得上传文件的名字
                    String fileName = fileItem.getName();
                    //避免文件名字重复
                    fileName = System.currentTimeMillis()+fileName;
                    File file = new File(realpath, fileName);
                    //把上传文件进行指定目录
                    fileItem.write(file);
                }
            }
            
            //因为上面解析request中是数据后,把普通表单组件中的key和value放到了request中,所以这里可以拿出来
            System.out.println("request.getAttribute(\"username\") = "+request.getAttribute("username"));
            
            
        } catch (Exception e) {
            e.printStackTrace();
        }
        
    }

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

}




下载:

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.annotation.WebInitParam;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@WebServlet(value="/download",initParams={@WebInitParam(name="path",value="/download")})
public class DownLoadServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;
    private String path;
    
    @Override
    public void init() throws ServletException {
        //在web.xml中把path值传过来或者使用注解 例如:
        /*
         *  <init-param>
           *        <param-name>path</param-name>
         *         <param-value>/download</param-value>
         *     </init-param>
         *
         */
        path = getServletConfig().getInitParameter("path");
    }
    
    @Override
    protected void doGet(HttpServletRequest request,
            HttpServletResponse response) throws ServletException, IOException {
        
        // 获得用户需要下载文件的名字
        String fileName = request.getParameter("fileName");
        
        // 下载文件所在目录的绝对路径
        String realPath = getServletContext().getRealPath(path);

        // 响应类型设置为下载:application/x-download
        response.setContentType("application/x-download");
        
        // 下载文件时显示文件的保存名称
        String fileDisplay = "briup_"+fileName;
        // 下载文件名的中文编码转换 因为写回去的时候是字节流
        fileDisplay = new String(fileName.getBytes("utf-8"),"ISO-8859-1");
        
        // 设置响应头部信息(http协议中的固定设置方式)
        response.addHeader("Content-Disposition", "attachment;filename="+fileDisplay);
        try {
            ServletOutputStream out = response.getOutputStream();
            File file = new File(realPath,fileName);
            FileInputStream in = new FileInputStream(file);
            byte[] b = new byte[1024];
            int len = -1;
            while ((len = in.read(b)) != -1) {
                out.write(b, 0, len);
            }
            out.flush();
            in.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
        
        //注意下载之后就不能使用request跳转了,因为response已经返回了
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp)
            throws ServletException, IOException {
        doGet(req, resp);
    }

}


原创粉丝点击