概要
基于Servlet的文件上传
业务场景如下:
后台管理商品上架:添加商品名称,商品类型,商品颜色,商品价格,以及商品描述,最后将商品图片上传之后,点击保存,将数据保存在数据库中,并渲染在页面上
上传文件表单的三要素:
1.表单method必须为post方式
2.必须要有file文件域
3.表单的enctype的值必须为multipart/form-data
<form method="post" action="UploadShopServlet" enctype="multipart/form-data">
pname: <input type="text" name="pname"/>
file: <input type="file" name="file">
<input type="submit" value="upload">
</form>
Controller层
由于表单的enctype的值变成了multi-part/form-data方式,以前传统的request.getParameter("")的方式已经无法获取表单中的值
String pname =request.getParameter("pname");
String afile=request.getParameter("file");
SyStem.out.println(pname);
SyStem.out.println(afile); (不能用)
文件上传的六个步骤
1. 创建DiskFileItemFactory对象 2. 使用DiskFileItemFactory对象作为参数创建一个ServletFileUpload对象 3. 解析请求,得到一个FileItem的一个集合对象 4. 判断表单中的内容是普通的表单域还是文件域 5. 获取文件上传的路径 6. 实现文件的上传
package com.qfedu.controller;
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;
import javax.servlet.annotation.WebServlet;
import java.io.File;
import java.io.IOException;
import java.util.List;
@WebServlet(urlPatterns = "/UploadServlet")
public class UploadServlet extends javax.servlet.http.HttpServlet {
protected void doPost(javax.servlet.http.HttpServletRequest request, javax.servlet.http.HttpServletResponse response) throws javax.servlet.ServletException, IOException {
/**
*
* 1. 创建DiskFileItemFactory对象
* 2. 使用DiskFileItemFactory对象作为参数创建一个ServletFileUpload对象
* 3. 解析请求,得到一个FileItem的一个集合对象
* 4. 判断表单中的内容时普通的表单域还是文件域
* 5. 获取文件上传的路径
* 6. 实现文件的上传
*/
DiskFileItemFactory dfif = new DiskFileItemFactory();
ServletFileUpload sfu = new ServletFileUpload(dfif);
try {
List<FileItem> list = sfu.parseRequest(request);
System.out.println(list);
for (FileItem fi : list) {
if(fi.isFormField()){
System.out.println(fi.getFieldName() + "\t" + fi.getString());
}else{