美文网首页
Servlet上传文件

Servlet上传文件

作者: KaveeDJ | 来源:发表于2019-04-09 14:55 被阅读0次

首先准备上传页面:upload.html

  • form的method必须是post,get不能上传文件
  • 还需要加上enctype="multipart/form-data",表示提交的数据是二进制文件
  • 需要提供type="file"的字段进行上传
<!DOCTYPE html>

<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">

<form action="uploadPhoto" method="post" enctype="multipart/form-data">
    英雄名称:<input type="text" name="heroName" /> <br>
    上传头像:<input type="file" name="filepath" /> <br>
    <input type="submit" value="上传">
</form>

准备UploadPhotoServlet

  • 在UploadPhotoServlet进行上传功能开发
  • 需要用到两个第三方的jar包,commons-io-1.4.jarcommons-fileupload-1.2.2.jar,在下面下载,并放在WEB-INF/bin下
  • 选中两个jar->右键->Build Path
  • 链接:https://pan.baidu.com/s/1THFbmAcfh8tWee0oQVLzyQ
  • 提取码:fwfw
  • 完整Servlet代码
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.Iterator;
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.FileUploadException;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;

public class UploadPhotoServlet extends HttpServlet {
    
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        String filename = null;
        
        DiskFileItemFactory factory = new DiskFileItemFactory();
        ServletFileUpload upload = new ServletFileUpload(factory);
        // 设置上传文件的大小限制为1M
        factory.setSizeThreshold(1024 * 1024);
        
        List items = null;
        
        try {
            items = upload.parseRequest(req);
        } catch (FileUploadException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        
        Iterator iter = items.iterator();
        while (iter.hasNext()) {
            FileItem item = (FileItem) iter.next();
            if (!item.isFormField()) {
                // 根据时间戳创建头像文件
                filename = System.currentTimeMillis() + ".jpg";
                
                // 根据getRealPath获取上传文件夹
                String photoFolder = req.getServletContext().getRealPath("uploaded");
                
                File f = new File(photoFolder, filename);
                f.getParentFile().mkdirs();
                
                // 通过item.getInputStream()获取浏览器上传的文件的输入流
                InputStream is = item.getInputStream();
                
                // 复制文件
                FileOutputStream fos = new FileOutputStream(f);
                byte b[] = new byte[1024 * 1024];
                int length = 0;
                while (-1 != (length = is.read(b))) {
                    fos.write(b, 0, length);
                }
                fos.close();
            } else {
                System.out.println(item.getFieldName());
                String value = item.getString();
                value = new String(value.getBytes("ISO-8859-1"), "UTF-8");
                System.out.println(value);
            }
        }
        
        String html = "<img width='200' height='150' src='uploaded/%s' />";
        resp.setContentType("text/html");
        resp.getWriter().format(html, filename);
    }
}

配置web.xml

<servlet>
        <servlet-name>UploadPhotoServlet</servlet-name>
        <servlet-class>UploadPhotoServlet</servlet-class>
    </servlet>
    
    <servlet-mapping>
        <servlet-name>UploadPhotoServlet</servlet-name>
        <url-pattern>/uploadPhoto</url-pattern>
    </servlet-mapping>

上传测试

如何处理其他非File字段

  • 因为浏览器指定了以二进制的形式提交数据,那么就不能通过常规的手段获取非File字段:request.getParameter("heroName")
  • 在遍历Item时(Item即对应浏览器提交的字段),可以通过:item.isFormField,来判断是否是常规字段还是提交的文件
    image.png
    image.png

相关文章

网友评论

      本文标题:Servlet上传文件

      本文链接:https://www.haomeiwen.com/subject/qckbiqtx.html