简单的上传下载Demo

这篇博客主要展示了如何实现简单的文件上传和下载功能,通过示例代码帮助理解操作流程。
摘要由CSDN通过智能技术生成

上传

package com.atguigu.upload;

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

import javax.servlet.ServletContext;
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.FileUploadBase.FileSizeLimitExceededException;
import org.apache.commons.fileupload.FileUploadBase.SizeLimitExceededException;
import org.apache.commons.fileupload.FileUploadException;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
import org.eclipse.jdt.internal.compiler.ast.SynchronizedStatement;

/**
 * 处理文件上传的Servlet
 */
public class UploadServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //获取请求参数
//        String userName = request.getParameter("username");
//        String photo = request.getParameter("photo");
//        System.out.println(userName);
//        System.out.println(photo);
        //1.创建工厂类实例
        DiskFileItemFactory factory = new DiskFileItemFactory();
        //2.创建解析器类实例
        ServletFileUpload fileUpload = new ServletFileUpload(factory);
        //设置允许上传的单个文件的大小为15KB
        fileUpload.setFileSizeMax(1024*20);
        //设置允许上传的多个文件的总大小为45KB
        fileUpload.setSizeMax(1024*45);
        //3.解析请求
        try {
            List<FileItem> fileItems = fileUpload.parseRequest(request);
            //遍历fileItems得到每一个fileItem
            /*
             * 七个核心方法:
             * isFormField():用来判断是否是一个普通表单项
             * getFieldName():用来获取表单项中的name属性值
             * getString(String encoding):用来获取表单中用户输入的值,该方法中可以传一个字符集
             * getContentType():用来获取文件的类型,是一个MIME值
             * getName():用来获取文件名
             * getSize():用来获取文件的大小
             * write(File file):用来将文件写到服务器
             *
             */
            for (FileItem fileItem : fileItems) {
                //判断是否是一个普通表单项
                boolean formField = fileItem.isFormField();
                if(formField){
                    //证明是一个普通表单项
                    //获取name的属性值
                    String fieldName = fileItem.getFieldName();
                    //获取用户输入的值
                    String userName = fileItem.getString("UTF-8");
                    System.out.println("表单项中的name属性值是:"+fieldName);
                    System.out.println("表单项中的用户输入的值是:"+userName);
                }else{
                    //证明不是普通表单项
                    //获取文件的类型
                    String contentType = fileItem.getContentType();
                    //获取文件名
                    String name = fileItem.getName();
                    //判断文件名中是否包含\(主要针对IE浏览器)
                    if(name.contains("\\")){
                        name = name.substring(name.lastIndexOf("\\")+1);
                    }
                    //获取文件大小
                    long size = fileItem.getSize();
                    System.out.println("文件的类型是:"+contentType);
                    System.out.println("文件名是:"+name);
                    System.out.println("文件大小是:"+size+"字节");
                    //将文件写到G盘
//                    fileItem.write(new File("G:"+name));
                    //获取服务器端upload目录的真实路径
                    ServletContext servletContext = this.getServletContext();
                    String realPath = servletContext.getRealPath("upload");
                    //创建这个真实路径的目录
                    File file = new File(realPath);
                    //判断upload路径是否存在
                    if(!file.exists()){
                        file.mkdirs();
                    }
                    //使用UUID生成一个全球唯一的字符串
                    String prefix = UUID.randomUUID().toString().replace("-", "");
                    //将文件上传到服务器中指定的目录
                    fileItem.write(new File(realPath+"/"+prefix+"_"+name));
                    //重定向到成功页面
                }
            }
            response.sendRedirect(request.getContextPath()+"/success.jsp");
        } catch (FileSizeLimitExceededException e) {
            //设置错误消息
            request.setAttribute("msg", "单个文件的大小不能超过15KB!");
            request.getRequestDispatcher("/index.jsp").forward(request, response);
            e.printStackTrace();
        }catch (SizeLimitExceededException e) {
            //设置错误消息
            request.setAttribute("msg", "多个文件的总大小不能超过45KB!");
            request.getRequestDispatcher("/index.jsp").forward(request, response);
            e.printStackTrace();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

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

}

下载

package com.atguigu.upload;

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

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

import org.apache.commons.io.IOUtils;

import sun.misc.BASE64Encoder;

/**
 * 处理文件下载的Servlet
 */
public class DownLoadServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //获取要下载的资源的真实路径
        ServletContext servletContext = this.getServletContext();
        String realPath = servletContext.getRealPath("WEB-INF/download/Someone Like You.mp3");
        //设置一个文件的名字
        String fileName = "像你的他.mp3";
        //获取浏览器信息
        String header = request.getHeader("User-Agent");
        if(header.contains("Firefox")){
            //对于火狐浏览器需要进行Base64编码
            fileName = "=?utf-8?b?"+new BASE64Encoder().encode(fileName.getBytes())+"?=";
        }else{
            //对中文的文件名使用URL编码
            fileName = URLEncoder.encode(fileName, "UTF-8");
        }

        //1.创建一个输入流
        InputStream is = new  FileInputStream(new File(realPath));
        //2.设置两个响应头
        //①设置文件的类型,是一个MIME值
        //获取文件的MIME值
        String mimeType = servletContext.getMimeType(realPath);
        response.setContentType(mimeType);
        //②设置如何处理该文件
        response.setHeader("Content-Disposition", "attachment; filename="+fileName);
        //3.通过输出流输出到浏览器
        ServletOutputStream os = response.getOutputStream();
        IOUtils.copy(is, os);
        //关闭流
        is.close();

    }

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

}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值