2.12 基础文件上传
文件上传概要
上传文件
1.通过input type=file
2.通过 form 提交 以二进制方式传输数据 并可以传输文件数据 元素必须有name属性
method = "post" enctype="multipart/form-data"
3.服务器解析请求的数据
使用工具 commons-fileupload-1.2.jar
commons-io-1.3.2.jar
解析form中的数据
FileItem
name=beauty.png,
StoreLocation=D:\apache-tomcat-8.5.31\temp\upload_16b64998_1764f860805__7f72_00000001.tmp,
size=2079bytes,
isFormField=false,
FieldName=ufile
4.在服务器创建一个文件 (同名文件 或 UUID重命名文件)
5.把解析出来的文件内容 写入到自己创建的文件中
配合ajax请求
6.返回文件的路径 (保存数据是时使用 生成预览)
1.前台 上传表单
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>$Title$</title>
</head>
<body>
<form action="upload" method="post" enctype="multipart/form-data">
<input type="text" name="uname">
<input type="file" name="ufile">
<br>
<input type="submit">
</form>
</body>
</html>
2.后台接收上传文件(ajax)
package com.javasm.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.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.File;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.List;
@WebServlet("/ajaxupload")
public class AjaxUploadServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doPost(req, resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//运行的文件在服务器上的真实路径
String bashPath = getServletContext().getRealPath("/");
System.out.println(bashPath);
//文件存储的路径
String folderPath = "upload/";
String returnPath = "";
DiskFileItemFactory dff = new DiskFileItemFactory();
ServletFileUpload sfu = new ServletFileUpload(dff);
try {
List<FileItem> filist = sfu.parseRequest(req);
System.out.println(filist);
for(FileItem fi:filist){
//文件
if(!fi.isFormField()){
//在服务器指定地址创建一个跟上传文件的同名文件
//再把临时文件内容复制入新创建的文件
//上传的文件名
String filePath = bashPath+folderPath+fi.getName();
/*
* 如果有很多用户往统一个目录存文件 可以通过UUID重命名文件 (截取到文件扩展名 跟uuid拼接起来)
* 避免用户上传文件名重复问题
* */
File newFile = new File(filePath);
//复制文件
fi.write(newFile);
returnPath = folderPath+fi.getName();
}
}
} catch (FileUploadException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
resp.setContentType("text/html;charset=utf-8");
PrintWriter writer = resp.getWriter();
writer.print("{\"imgsrc\":\""+returnPath+"\"}");
writer.flush();
writer.close();
}
}
2.后台接收上传文件(同步)
package com.javasm.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.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.File;
import java.io.IOException;
import java.util.List;
@WebServlet("/upload")
public class UploadServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doPost(req, resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String uname = req.getParameter("uname");
String ufile = req.getParameter("ufile");
System.out.println(uname);
System.out.println(ufile);
String bashPath = getServletContext().getRealPath("/");
System.out.println(bashPath);
String folderPath = "upload/";
//判断请求方式是否是Multipart/formdata
boolean isMultipart = ServletFileUpload.isMultipartContent(req);
System.out.println(isMultipart);
DiskFileItemFactory dff = new DiskFileItemFactory();
ServletFileUpload sfu = new ServletFileUpload(dff);
try {
List<FileItem> filist = sfu.parseRequest(req);
System.out.println(filist);
for(FileItem fi:filist){
//文件
if(!fi.isFormField()){
//在服务器指定地址创建一个跟上传文件的同名文件
//再把临时文件内容复制入新创建的文件
//上传的文件名
String filePath = bashPath+folderPath+fi.getName();
File newFile = new File(filePath);
//复制文件
fi.write(newFile);
}else{
//普通表单数据
String fieldName = fi.getFieldName();
String fieldValue = fi.getString();
String newVal =new String(fieldValue.getBytes("iso-8859-1"),"utf-8");
System.out.println(fieldName+newVal);
}
}
} catch (FileUploadException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
}
}