众所周和,java在做web项目开发时,经常用到文件上传功能,如果上传用户头像,照片,上传word文件等。那么今天我们就一起来探索一下java实现文件上传的第一种方式:
首先看一下上传input的写法:
<html>
<head>
<meta charset="UTF-8">
<title>文件上传title>
head>
<body>
<form action="upload" method="post" enctype="multipart/form-data">
<input type="file" name="name1" size="20" maxlength="80">
<input type="submit" value="上传">
form>
body>
html>
注意一下几点:
1. 表单提交方式必须为post
2. input类型为File
3. input 必须含有name属性
4. 表单必须含有:enctype=”multipart/form-data” 。
jspSmartUp组件是一种早期流行的使用框架,适合于上传小型的文件,具有灵活性简单高效。
使用方法很简单,大致流程如下:
常用类及方法:
1. SmartUpload类
getFiles: 获取上传的所有文件
getRequest: 获得上传表单的其他表单项的值
setMaxFileSize : 设置上传文件的单个大小限制
2.File类
isMissing :用于判断是否选择了文件,即对应表单项是否有值
getFiledName : 获取HTML表单项的名字
getFileName : 获取上传文件的文件名
getFilePathName:获取文件全名
getSize:获取文件长度
saveAs:将文件换名存储
3.Files类
getCount :获取上传文件的个数
getSize:获取上传文件的总长度
getFile:按Index得到File对象
直接上代码:
import java.io.IOException;
import java.io.PrintWriter;
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 com.jspsmart.upload.File;
import com.jspsmart.upload.Files;
import com.jspsmart.upload.SmartUpload;
import com.jspsmart.upload.SmartUploadException;
@WebServlet("/upload")
public class UploadServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
public UploadServlet() {
}
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doPost(request, response);
}
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
SmartUpload upload = new SmartUpload();//创建组件对象
upload.initialize(this.getServletConfig(), request, response);// 初始化
upload.setMaxFileSize(1 * 1024 * 1024);// 每个文件最大1M
upload.setTotalMaxFileSize(10 * 1024 * 1024);// 总共最大10M
upload.setAllowedFilesList("jpg,png");// 允许上传jpg,png
try {
upload.upload();
Files uploadFiles = upload.getFiles();
String fileName = uploadFiles.getFile(0).getFileName();
System.out.println("上传数量: " + uploadFiles.getCount());
uploadFiles.getFile(0).saveAs("/upload/"+fileName, File.SAVEAS_PHYSICAL);//将文件保存在磁盘根目录下的upload文件夹
} catch (SmartUploadException e) {
e.printStackTrace();
}
}
}
我们使用的是换名存储,即将上传的文件改为我们自己取的名字后保存。
这里使用的是File类的saveAs方法,其使用方式如下:
- saveAs(String destFilePathName)
- saveAs(String destFilePathName,int optionSaveAs)
optionSaveAs有三种取值:SAVEAS_AUTO、SAVEAS_VIRTUAL、SAVEAS_PHYSICAL。均为File类的静态字段(整数对应0、1、2)
分别说明:
SAVEAS_VIRTUAL
以Web应用的根目录为文件根目录,然后加上destFilePathName参数指定的路径来保存文件
如saveAs(”/upload/1.jpg”,1),则1.jpg将保存在 D:\Tomcat 8.5\webapps\FileUpDown\upload\1.jpg 如果upload文件夹不存在,将抛出This path does not exist (1135) 异常
SAVEAS_PHYSICAL
以Web服务器的安装路径中的磁盘根目录为文件根目录,加上destFilePathName参数指定的路径来保存文件
如saveAs(”/upload/1.jpg”,2),则1.jpg将保存在 D:\upload\FileUpDown\upload\1.jpg
如果D盘与根目录下的upload文件夹都不存在,则抛出This path does not exist (1135) 异常
如果D盘不存在,而根目录存在upload,则抛出The path is not a physical path 异常
SAVEAS_AUTO
则首先以SAVEAS_VIRTUAL方式来保存文件,若Web应用下由destFilePathName参数指定的路径不存在,则以SAVEAS_PHYSICAL方式保存文件
运行结果:
如果要同时长传多张:则表单需要设置multiple=”multiple”
另外在servlet中也需要遍历多张
protected void doPost(HttpServletRequest request, HttpServletResponseresponse)
throws ServletException, IOException {
SmartUpload upload = new SmartUpload();// 创建组件对象
upload.initialize(this.getServletConfig(), request, response);// 初始化
upload.setMaxFileSize(1 * 1024 * 1024);// 每个文件最大1M
upload.setTotalMaxFileSize(10 * 1024 * 1024);// 总共最大10M
upload.setAllowedFilesList("jpg,png");// 允许上传jpg,png
try {
upload.upload();
Files uploadFiles = upload.getFiles();
System.out.println("上传数量: " + uploadFiles.getCount());
for(int i=0;i"/upload/" + fileName, File.SAVEAS_PHYSICAL);// 将文件保存在磁盘根目录下的upload文件夹
}
} catch (SmartUploadException e) {
e.printStackTrace();
}
}