关于文件上传


1.最主要两个jar包


commons-fileupload
commons-fileupload
1.4



commons-io
commons-io
2.11.0


其中两个类,
(1)DiskFileItemFactory factory = new DiskFileItemFactory();
其中磁盘文件工厂,是最底层存储东西的,可以设置临时目录,临时目录临界值

(2)ServletFileUpload upload = new ServletFileUpload(factory);

可以设置文件上传最大值,文件监听
  
    List fileItems = upload.parseRequest(request);
方法可以将所有表单传递过来的数据读取出来,可用循环判断是不是文件
for (FileItem fileItem : fileItems) {},然后分别执行操作




做到此处发现问题:路径,
关于此处IO流中,路径“/”代表的是tomcat目录所在的磁盘根目录





案例:
package Com.Ren.Servlet;

import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileUploadException;
import org.apache.commons.fileupload.ProgressListener;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;

import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.annotation.*;
import java.io.*;
import java.util.List;
import java.util.UUID;

@WebServlet("/UploadServlet")
public class UploadServlet extends HttpServlet {
// 上传配置
private static final int MEMORY_THRESHOLD = 1024 * 1024 * 3; // 3MB
private static final int MAX_FILE_SIZE = 1024 * 1024 * 40; // 40MB
private static final int MAX_REQUEST_SIZE = 1024 * 1024 * 50; // 50MB


private String msg;


@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//判断是不是文件上传表单
if (!ServletFileUpload.isMultipartContent(request)){
response.getWriter().print("不是文件上传的表单");
return;
}
//得到磁盘文件工厂
DiskFileItemFactory factory = new DiskFileItemFactory();

factory.setSizeThreshold(MEMORY_THRESHOLD);
// 设置临时存储目录

String uploadPath = request.getServletContext().getRealPath("/WEB-INF/upload") ;
String tempPath = request.getServletContext().getRealPath("/WEB-INF/temp") ;
File tempFile = new File(uploadPath);
//判断文件夹是否存在,如果不存在就创建
if (!tempFile.exists()){
tempFile.mkdir();
}

factory.setRepository(tempFile);
//临时目录产生,临界值
factory.setSizeThreshold(MEMORY_THRESHOLD);
ServletFileUpload upload = new ServletFileUpload(factory);
//设置文件上传最大值
upload.setSizeMax(MAX_FILE_SIZE);
//设置请求最大值
upload.setSizeMax(MAX_REQUEST_SIZE);
//中文处理
upload.setHeaderEncoding("utf-8");
//文件监听
upload.setProgressListener(new ProgressListener() {
@Override
public void update(long l, long l1, int i) {
System.out.println("总大小:" + l1 + ",已上传:" + l);
}
});

//取出提交的每一项
try {
List fileItems = upload.parseRequest(request);
for (FileItem fileItem : fileItems) {
if (fileItem.isFormField()){ //是普通的表单数据
String name = fileItem.getFieldName();
String value = fileItem.getString("utf-8");
System.out.println(name + ":" + value);


}else {//是文件数据
//处理文件
String upLoadFileName = fileItem.getName();
System.out.println(upLoadFileName);

//判断改文件名字是否为空
if (upLoadFileName.trim().equals("") || upLoadFileName == null){
continue;
}

//如果不为空,获得文件名
String fileName = upLoadFileName.substring(upLoadFileName.lastIndexOf("/") + 1);
//获得文件后缀
String fileEXTName = upLoadFileName.substring(upLoadFileName.lastIndexOf(".") + 1);

System.out.println("文件名:" + fileName);
System.out.println("后缀名:" + fileEXTName);

//文件存放地址
String uuidPath = UUID.randomUUID().toString();
String realPaht = uploadPath + "/" + uuidPath;
File file = new File(realPaht);
if (!file.exists()){
file.mkdir();
}
//获取当前文件上传流
InputStream inputStream = fileItem.getInputStream();
//获取要输出位置的流
BufferedOutputStream bufferedOutputStream = new BufferedOutputStream(new FileOutputStream(realPaht + "/" + fileName));

System.out.println(realPaht);
byte bytes[] = new byte[1024 * 2];
int len = 0;
while((len = inputStream.read(bytes)) > 0){
bufferedOutputStream.write(bytes,0,len);
}
bufferedOutputStream.close();
inputStream.close();

msg = "文件上传成功";
System.out.println(msg);
}
}


} catch (FileUploadException e) {
e.printStackTrace();
}


}
}











相关