@Dukebf
2017-07-12T00:04:50.000000Z
字数 2489
阅读 1160
jsp
因为项目需要使用jsp来搭建个小网站,有个上传文件的功能,自己又是刚入手jsp,就碰上了不少问题。
首先下载项目依赖的两个文件,commons-fileupload (官网下载) 以及 commons-io (官网下载)。
java ee 中新建动态网站项目,然后在 WebContent -> WEB-INF -> lib 中 放入这两个包,如果没有lib文件夹,就新建一个,分别右键点击这两个包,Bulid Path -> Add to Bulid Path。
注意: 一定要把包放入指定的 lib 文件夹中,否则会有找不到类的错误。
java.lang.ClassNotFoundException:org.apache.commons.fileupload.FileItemFactory
或者
java.lang.NoClassDefFoundError:org/apache/commons/fileupload/FileItemFactor
上传文件的代码,是从菜鸟教程(传送门)上学的。
简单描述,就是使用了Apache中 commons-fileupload 和 commons-io-2.5 两个包,然后通过servlet处理POST请求,然后存储文件到指定位置中。
代码主要由两个界面(upload.jsp, message.jsp)和一个servlet(UploadServlet.java)组成。
先看下UploadServlet.java 里面的主要逻辑
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 检测是否为多媒体上传
if(!ServletFileUpload.isMultipartContent(request)){
PrintWriter writer = response.getWriter();
writer.println("Error: 表单必须包含enctype=multipart/form-data");
writer.flush();
return;
}
// 配置上传参数
DiskFileItemFactory factory = new DiskFileItemFactory();
// 设置内存临界值
factory.setSizeThreshold(MEMORY_THRESHOLD);
// 设置临时存储目录
factory.setRepository(new File(System.getProperty("java.io.tmpdir")));
ServletFileUpload upload = new ServletFileUpload(factory);
// 设置最大文件上传值
upload.setFileSizeMax(MAX_FILE_SIZE);
// 设置最大请求值(包含文件和表单数据)
upload.setSizeMax(MAX_REQUEST_SIZE);
// 中文处理
upload.setHeaderEncoding("UTF-8");
// 构造临时路径来存储上传的文件
// 路径是相对当前应用的目录
String uploadPath = getServletContext().getRealPath("./")+File.separator+UPLOAD_DIRECTORY;
//如果目录不存在,则创建
File uploadDir = new File(uploadPath);
if(!uploadDir.exists()){
uploadDir.mkdir();
}
try {
// 解析请求的内容,提取文件数据
List<FileItem> formItems = upload.parseRequest(request);
if (formItems != null && formItems.size() > 0) {
// 迭代表单数据
for (FileItem item : formItems) {
// 处理不在表单中的字段
if (!item.isFormField()) {
String fileName = new File(item.getName()).getName();
String filePath = uploadPath + File.separator + fileName + fileName;
File storeFile = new File(filePath);
// 在控制台输出文件的上传路径
System.out.println(filePath);
// 保存文件到硬盘
item.write(storeFile);
request.setAttribute("message", "文件上传成功");
}
}
}
} catch (Exception e) {
request.setAttribute("message", "错误信息:"+e.getMessage());
}
// 跳转到 message.jsp
getServletContext().getRequestDispatcher("/message.jsp").forward(request, response);
再看看 upload.jsp 中的,需要注意的是在表单中需要设置 <form enctype="multipart/form-data">
.
<h1>文件上传实例</h1>
<form action="/blackandwhite/UploadServlet" method="POST" enctype="multipart/form-data">
<p>选择一个文件</p>
<input type="file" name="uploadFile">
<input type="submit" value="上传" >
</form>
最后一个文件 message.jsp 是用了显示上传的结果信息:
<h2 style="text-align:center;">结果:${message}</h2>
然后就可以运行了。