1.进行文件上传时,表单需要做的准备:
1).请求方式为POST:<form action="uploadServlet" method="post"....>
2).使用file的表单域:<input type="file" name="file" />
3).请求的编码方式:<form action="uploadServlet" method="post" enctype="multipart/form-data">
表单以二进制传输数据
<form action="uploadServlet" method="post" enctype="multipart/form-data">
File:<input type="file" name="file" /><br>
<input type="submit" value="Submit"/>
</form>
2.服务端:
1).不能再使用request.getParameter()等方式获取请求信息。获取不到,因为请求的编码方式已经改为multipart/form-data,
以二进制的方式来提交请求信息。
2).可以使用输入流的方式来获取。但不建议这样做。
3).具体使用commons-fileupload组件来完成文件的上传操作。
搭建环境:
①.加入commons-fileupload-1.3.3.jar
commons-io-2.6.jar
②.基本思想:
*commons-fileupload 可以解析请求,得到一个FileItem对象组成的List
*commons-fileupload 把所有的请求信息都解析为FileItem对象,无论是一个一般的文本域还是一个文件域。
*可以调用FileItem的isFormField()方法来判断是一个表单域或不是表单域(则是一个文件域)
*再来进一步获取信息
if (item.isFormField()) {
String name = item.getFieldName();
String value = item.getString();
...
}
如果是一个多选,如何获取对应的字符串数组:每一个都对应一个FileItem对象。
<input type="checkbox" name="interesting" value="Reading"/>Reading
<input type="checkbox" name="interesting" value="Party"/>Party
<input type="checkbox" name="interesting" value="Shopping"/>Shopping
if (!item.isFormField()) {
String fieldName = item.getFieldName();
String fileName = item.getName();
String contentType = item.getContentType();
boolean isInMemory = item.isInMemory();
long sizeInBytes = item.getSize();
InputStream uploadedStream = item.getInputStream();
...
uploadedStream.close();
}
③.如何得到List<FileItem>对象
>简单的方式
// Create a factory for disk-based file items
DiskFileItemFactory factory = new DiskFileItemFactory();
// Configure a repository (to ensure a secure temp location is used)
ServletContext servletContext = this.getServletConfig().getServletContext();
File repository = (File) servletContext.getAttribute("javax.servlet.context.tempdir");
factory.setRepository(repository);
// Create a new file upload handler
ServletFileUpload upload = new ServletFileUpload(factory);
// Parse the request
List<FileItem> items = upload.parseRequest(request);
>复杂的方式:可以为文件的上传加入一些限制条件和其他的属性。
// Create a factory for disk-based file items
DiskFileItemFactory factory = new DiskFileItemFactory();
//设置内存中最多可以存放的上传文件的大小,若超出则把文件写到一个临时文件夹中。以byte为单位
factory.setSizeThreshold(yourMaxMemorySize);
//设置那个临时文件夹
factory.setRepository(yourTempDirectory);
// Create a new file upload handler
ServletFileUpload upload = new ServletFileUpload(factory);
// 设置上传的文件的总的大小。也可以设置单个文件的大小。
upload.setSizeMax(yourMaxRequestSize);
// Parse the request
List<FileItem> items = upload.parseRequest(request);
3.使用fileupload组件完成文件的上传应用
1).需求:
①.上传
>在upload.jsp页面上使用jQuery实现“新增一个附件”,“删除附件”。但至少需要保留一个
>对文件的扩展名和文件的大小进行验证,一下的规则是可配置的,而不是写死在程序中的
>>文件的扩展名必须为.pptx,docx,doc
>>每个文件的大小不能超过1M
>>总的文件大小不能超过5M。
>若验证失败,则在upload.jsp页面上显示错误消息:
>>若某一个文件不符合要求:xxx文件拓展名不合法或xxx文件大小超过1M
>>总的文件大小不能超过5M
>若验证通过,则进行文件的上传操作
>>文件上传,并给一个不能和其他文件重复的名字,但拓展名不变
>>在对应的数据表中添加一条记录。
<script type="text/javascript">
$(function () {
//1.获取#addFile,并为其添加click响应函数
var i=2;
$("#addFile").click(function () {
//2.利用jQuery生存城一下节点,注意数字的变化,并把他们放在#br的前面
//其中“删除”按钮可以删除当前的file和desc相关节点
/*
File1:<input type="file" name="file1" />
<br>
Desc1:<input type="text" name="desc1" /><button>删除</button>
<br>
*/
$("#br").before("<div>File"
+i+":<input type='file' name='file"
+i+"'/><br>Desc"
+i+":<input type='text' name='desc"
+i+"'/><input type='button' value='删除' id='button' /><br><br></div>")
.prev("div").find("#button").click(function(){
$(this).parent("div").remove();
i--;
});
i++;
});
});
</script>
4.如何修改小工具或框架的源代码?
1).原则:能不修改就不修改。
2).修改的方法:
>修改源代码,替换jar包中对应的class文件。
>在本地新建相同的包,和类,在这个类中修改即可。