Java开发系列-文件上传

概述

Java开发中文件上传的方式有很多,常见的有servlet3.0、common-fileUpload、框架。不管哪种方式,对于文件上传的本质是不变的。

文件上传的准备

文件上传需要客户端跟服务都有必须的规定,跟普通的post表单提交不太一样。

客户端的要求

  1. 首先请求的方式必须是Post请求。
  2. 以往我们通过表单提交普通数据用的组件,比如input类型text、checkbox、password等这些我们称之为普通上传组件。对于文件上传使用的组件必须是
    <input type="file" name="">
  3. 对于表单必须添加属性 enctype="multipart/form-data"

服务端要求

在Servlet3.0中,接受文件上传组件的数据不再是通过request.getParameter(),而是通过request.getPart

// 获取上传组件
Part part = request.getPart("f");
// 获取文件上传的文件二进制数据
InputStream inputStream = part.getInputStream();

Servlet3.0文件上传

在Servlet3.0中,提供了一个注解@MultipartConfig,当Servlet添加该注解后才可在接受到Post请求通过request.getPart()获取到文件组件的Port对象,否则取值为nil。

具体的文件上代码

package com.coderhong.web.servlet;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import javax.servlet.ServletException;
import javax.servlet.annotation.MultipartConfig;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.Part;

import org.apache.commons.io.IOUtils;

@WebServlet("/upload")
@MultipartConfig
public class ServletDemo1 extends HttpServlet {
    private static final long serialVersionUID = 1L;

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        
        request.setCharacterEncoding("utf-8");
        
        String username = request.getParameter("username");
        System.out.println(username);
        
        // 获取上传组件
        Part part = request.getPart("f");
        System.out.println(part);
        
        // 获取文件名
        String dis = part.getHeader("Content-Disposition");
        //System.out.println(header); // // form-data; name="f"; filename="Desert.jpg"
        String prefStr = "filename=";
        String fileName = dis.substring(dis.indexOf(prefStr)+prefStr.length()+1, dis.length()-1);
        
        // 获取项目路径
        String projPath =  request.getServletContext().getRealPath("/upload/");
        File file = new File(projPath);
        if(!file.exists()){
            file.mkdirs();
        }
        
        // 获取文件上传的文件二进制数据
        InputStream inputStream = part.getInputStream();
        // 流拷贝存储文件到目标目录
        OutputStream os = new FileOutputStream(new File(projPath, fileName));
        IOUtils.copy(inputStream, os);
        // 释放流资源
        os.close();
        inputStream.close();
    }

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

}

猜你喜欢

转载自www.cnblogs.com/CoderHong/p/9508598.html