## 关于SSM文件上传和Java文件上传的方式比对
本人一学生,想将所学的东西再这里记录下来,写的不好请多指教。
首先,先上javaweb实现的代码。
package multi;
import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileUploadException;
import org.apache.commons.fileupload.disk.DiskFileItem;
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.*;
import java.util.Calendar;
import java.util.List;
/**
*
* 作业2
*
* 具体页面为multipate.jsp
*
* 1)临时文件 文件发送时会把文件分开一份一份,随机发送到临时文件里temp目录,然后最后再指定文件里最后合成
* 设置临时文件的边界,大于该值,上传文件会先保存再临时文件中,否则,上传文件将直接写入内存中
* fac.setSizeThreshold(1024*1024*1);
* fac.setRepository(new File(tempPath));
*
* 2)解决乱码问题
* String value = item.getString("utf-8");
* 特别的是 1)文件名乱码问题 2)上传文件同名问题
*
* 3)文件上传大小的限制
* upload.setFileSizeMax(1024*1024*10); //设置单个上传文件的最大边界值
* upload.setSizeMax(1024*1024*100); //设置多个上传文件的最大边界值
*
* 4)文件目录的管理 按照每天创建一个 避免该文件夹由于文件数量过多而装不下的情况
*/
@WebServlet("/mul2")
public class muk2 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
super.doGet(req, resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
req.setCharacterEncoding("utf-8");
//使用fileupload工具类
if(!ServletFileUpload.isMultipartContent(req)){//判断返回的是否为multipart的请求
throw new RuntimeException("当前请求不支持文件上传");
}
String path = this.getServletContext().getRealPath("/code/img");//----------获取文件保存在服务器的路劲
String tempPath = this.getServletContext().getRealPath("/code/temp");//----------------临时文件的地址
try {
DiskFileItemFactory fac = new DiskFileItemFactory();//------------------------创建工厂 把文件存到磁盘上(大的)
fac.setSizeThreshold(1024*1024*1); //-------------------------设置临时文件为1mb
fac.setRepository(new File(tempPath)); //-------------------------设置临时文件的地址
ServletFileUpload upload = new ServletFileUpload(fac);//-----------------------创建上传的核心组件
Calendar now = Calendar.getInstance(); //用Calendar获取日期
int year = now.get(Calendar.YEAR);
int month = now.get(Calendar.MONTH) + 1;
int day = now.get(Calendar.DAY_OF_MONTH);
path = path + "/" + year + "/" + month + "/" + day; //在img目录下添加文件夹的
File file = new File(path);
if(!file.exists()){ //如果文件夹不存在就创建新目录
boolean mkdir = file.mkdirs();
if(mkdir){
System.out.println("创建成功");
}
}
upload.setHeaderEncoding("utf-8"); //在核心组件处解决文件名的乱码问题
upload.setFileSizeMax(1024*1024*100); //设置单个上传文件的最大边界值 100M
upload.setSizeMax(1024*1024*1000); //设置多个上传文件的最大边界值 1000M
List<FileItem> items = upload.parseRequest(req); //------------------------解析请求
for (FileItem item : items) { //------------------------遍历items 可以处理多文件上传
if(item.isFormField()){ //------------------------为普通表单项
String fieldName = item.getFieldName();
String value = item.getString("utf-8");//解决乱码问题
System.out.println(fieldName + value);
}else { //------------------------为文件表单项
String fieldName = item.getName();
fieldName = fieldName + System.currentTimeMillis();//---------------给文件名加上毫秒避免了同文件名上传不了
String value = item.getString();
System.out.println(fieldName);
InputStream is = item.getInputStream();
OutputStream os = new FileOutputStream(new File(path, fieldName));//保存的路径
//将输入流的数据写入输出流里
byte[] buffer = new byte[1024];
int len = -1;
while ((len = is.read(buffer)) != -1){
os.write(buffer,0,len);
}
os.close();
is.close();
item.delete(); //--------------------------临时文件的删除
}
}
} catch (FileUploadException e) {
e.printStackTrace();
}
要实现文件的上传,前端的页面必须满足两个条件:
1)post提交请求
2)表单项带enctype=“multipart/form-data”
3)表单文件type为file,type=“file”
然后现在分析一下
1)ServletFileUpload.isMultipartContent(req)判断是否为表单文件上传
2) DiskFileItemFactory fac = new DiskFileItemFactory();创建文件上传的工厂
临时文件 文件发送时会把文件分开一份一份,随机发送到临时文件里temp目录,然后最后再指定文件里最后合成
- 设置临时文件的边界,大于该值,上传文件会先保存再临时文件中,否则,上传文件将直接写入内存中
- fac.setSizeThreshold(1024*1024);
- fac.setRepository(new File(tempPath));
--------相关方法:
setSizeThreshold:设置临时文件的大小
setRepository:设置临时文件的上传地址
3)ServletFileUpload upload = new ServletFileUpload(fac);通过工厂创建组件
还有一些关于他的方法
setHeaderEncoding(“utf-8”);设置文件名的编码
setFileSizeMax(10241024100);设置单个文件大小的上限
setSizeMax(102410241000);设置多个个文件大小的上限
下面是关于ssm的文件上传,它相对javaweb封装了起来,直接调用即可
public void l(String username, MultipartFile upload,MultipartFile upload2) throws IOException {
System.out.println(username);
System.out.println(upload);
System.out.println(upload2);
String fileName = upload.getOriginalFilename();//获取文件名
upload.transferTo(new File("C:\\Users\\86135\\Desktop\\java\\day1\\"+fileName));
}
最后一个是关于对他们文件夹维护,因为如果每天下载图片,很可能造成文件夹的文件数量达到上限,所以可以在创建文件时管理文件夹。
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
req.setCharacterEncoding(“utf-8”);
//使用fileupload工具类
if(!ServletFileUpload.isMultipartContent(req)){//判断返回的是否为multipart的请求
throw new RuntimeException("当前请求不支持文件上传");
}
String path = this.getServletContext().getRealPath("/code/img");//----------获取文件保存在服务器的路劲
String tempPath = this.getServletContext().getRealPath("/code/temp");//----------------临时文件的地址
try {
DiskFileItemFactory fac = new DiskFileItemFactory();//------------------------创建工厂 把文件存到磁盘上(大的)
fac.setSizeThreshold(1024*1024*1); //-------------------------设置临时文件为1mb
fac.setRepository(new File(tempPath)); //-------------------------设置临时文件的地址
ServletFileUpload upload = new ServletFileUpload(fac);//-----------------------创建上传的核心组件
Calendar now = Calendar.getInstance(); //用Calendar获取日期
int year = now.get(Calendar.YEAR);
int month = now.get(Calendar.MONTH) + 1;
int day = now.get(Calendar.DAY_OF_MONTH);
path = path + "/" + year + "/" + month + "/" + day; //在img目录下添加文件夹的
File file = new File(path);
if(!file.exists()){ //如果文件夹不存在就创建新目录
boolean mkdir = file.mkdirs();
if(mkdir){
System.out.println("创建成功");
}
}
upload.setHeaderEncoding("utf-8"); //在核心组件处解决文件名的乱码问题
upload.setFileSizeMax(1024*1024*100); //设置单个上传文件的最大边界值 100M
upload.setSizeMax(1024*1024*1000); //设置多个上传文件的最大边界值 1000M
List<FileItem> items = upload.parseRequest(req); //------------------------解析请求
for (FileItem item : items) { //------------------------遍历items 可以处理多文件上传
if(item.isFormField()){ //------------------------为普通表单项
String fieldName = item.getFieldName();
String value = item.getString("utf-8");//解决乱码问题
System.out.println(fieldName + value);
}else { //------------------------为文件表单项
String fieldName = item.getName();
fieldName = fieldName + System.currentTimeMillis();//---------------给文件名加上毫秒避免了同文件名上传不了
String value = item.getString();
System.out.println(fieldName);
InputStream is = item.getInputStream();
OutputStream os = new FileOutputStream(new File(path, fieldName));//保存的路径
//将输入流的数据写入输出流里
byte[] buffer = new byte[1024];
int len = -1;
while ((len = is.read(buffer)) != -1){
os.write(buffer,0,len);
}
os.close();
is.close();
item.delete(); //--------------------------临时文件的删除
}
}
} catch (FileUploadException e) {
e.printStackTrace();
}
}
到时他的目录如下,每天会创建一个文件夹,而且文件会自带时间戳,防止文件同名的问题。注解十分清晰。
以上,就是关于文件上传的问题总结。