撰写时间:2019年08月18日
JSP可以通过HTML的form表单上传文件到服务器。 文件类型可以是文本文件、二进制文件、图像文件等其他任何文档。
创建文件上传表单
接下来我们使用HTML标签来创建文件上传表单,以下为要注意的点:
- form表单 method 属性必须设置为 POST 方法 ,不能使用GET 方法。form表单 enctype 属性需要设置为 multipart/form-data。
- form表单 action 属性需要设置为提交到后台处理文件上传的jsp文件地址。例如 uploadFile.jsp 程序文件用来处理上传的文件。
- 上传文件元素需要使用 <input …/> 标签,属性设置为 type=“file”。如果需要上传多个文件,可以在 <input …/>标签中设置不同的名称。
一个上传文件的表单,实例如下:
<form id="fmPersonalDetails" action="${ctx}/servlet/myAccountServlet" method="post" enctype="multipart/form-data" autocomplete="off">
<img src="" alt="" width="150" height="180" id="InsertUserImg" />
<input type="file" style="margin-left:90px;margin-top:5px;display: none" name="IStudentPicture" id="IStudentPicture" />
<p class="text-center">上传的图片上限大小为10M!</p>
</form>
显示界面如下所示,在你点击"图片框"会弹出一个窗口让你选择要上传的文件:
后台数据处理:
因为form表单 enctype 属性需要设置为 multipart/form-data。
所以先写个判断,是否设置了该属性
private void insertFile(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
JsonReturn jsonReturn=new JsonReturn();
jsonReturn.setState(false);
//判断请求头中是否含有 enctype="multipart/form-data"
if (!ServletFileUpload.isMultipartContent(request)) {
jsonReturn.setMsg("Error:表单中必须包含enctype=\"multipart/form-data\"");
}else{
int sizeThreshold=1025*1024*5;//设置内存临界值 5M
int fileSizeMax=1025*1024*5;//设置单个文件的最大大小
int sizeMax=1025*1024*11;//设置请求的最大大小
DiskFileItemFactory factory=new DiskFileItemFactory();
//当文件超过设置的值时就写入到临时文件夹中,否则就保存在内存
factory.setSizeThreshold(sizeThreshold);
//设置DiskFileItemFactory的临时文件夹
//java.io.tmpdir 代表系统的temp目录
factory.setRepository(new File(System.getProperty("java.io.tmpdir")));
ServletFileUpload upload =new ServletFileUpload(factory);
//设置编码
upload.setHeaderEncoding("utf-8");
//设置单个文件的最大大小
upload.setFileSizeMax(fileSizeMax);
//设置请求的最大大小
upload.setSizeMax(sizeMax);
//构建上传目录的路径
String uploadPath="D:\\TotalUploadFile\\ecolp\\upload";
//如果目录不存在就创建
File uploadDir=new File(uploadPath);
if (!uploadDir.exists()) {//判断是否存在
uploadDir.mkdirs();//多层目录
}
try {
List<FileItem>fileItems=upload.parseRequest(request); fileItems:文件都在
for (FileItem fileItem : fileItems) {//遍历一个的取
//文件元素
if ("IStudentPicture".equals(fileItem.getFieldName())) {
//获取文件名
String oldName=new File(fileItem.getName()).getName();
String extensionName=".jpg";
//获取扩展名
if ((oldName!=null)&&(oldName.length()>0)) {
int dot=oldName.lastIndexOf('.');
if ((dot>-1)&&(dot<(oldName.length()-1))) {
extensionName=oldName.substring(dot);
}
}
//构建文件名称
String fileName=System.currentTimeMillis()+"_"+System.nanoTime()+extensionName;
String filePath=uploadPath+File.separator+fileName;
//保存文件到盘
try {
fileItem.write(new File(filePath));
} catch (Exception e) {
e.printStackTrace();
}
//保存文件名称到数据库
...
}
}
}catch (FileUploadException e) {
e.printStackTrace();
jsonReturn.setMsg("服务器异常,请稍后再试");
}
}
response.setCharacterEncoding("utf-8");
JSONObject jsonObject=JSONObject.fromObject(jsonReturn);
PrintWriter out=response.getWriter();
out.write(jsonObject.toString());
out.close();
}
以下脚本文件UploadFile.jsp可以处理多个上传的文件,在使用该脚本前,我们需要注意以下几点:
- 以下实例依赖 FileUpload, 所以你需要在你的classpath中引入最新的 commons-fileupload.x.x.jar包文件。
下载地址为:http://commons.apache.org/fileupload/。- FileUpload 依赖 Commons IO, 所以你需要在你的classpath中引入最新的 commons-io-x.x.jar 。 下载地址为: http://commons.apache.org/io/。
- 在测试以下实例时,你需要上传确认上传的文件大小小于 maxFileSize 变量设置的大小 ,否则文件无法上传成功。