本帖最后由 王超举 于 2017-8-8 10:33 编辑
关于上传有很多中技术实现手段如:struts2、FileUpload、Servlet3.0等都可以。今天我们来说下Servlet3.0实现上传功能开发。
首先要完成上传必须满足三个前提:
1、有上传项,即在表单中要有<input type="file" name="upload">这一项。
2、表单提交方式必须为post,为什么不能用get呀?这点很好理解,因为get有大小限制
3、上传的form表单中enctype属性值必须为multipart/form-data。为什么必须这么设置呢?看下图。一个是未设置采用默认、一个是设置之后的,很明显只有设置之后上传的头信息里才提交上传的内容。未设置的时候上传的头信息里没有上传的内容。
满足这三个前提后,我们就可以开发了。不难看出,我们的表单中有两项,设置enctype="multipart/form-data"后,上传项被3条分割线分割成两部分,就是我们form表单中的两项,一项是普通输入、一项是上传的文件。
在servlet3.0里,上传项被封装到了一个part对象中,我们可以操作part对象完成上传,开发步骤如下。
1、获取文件名、输入流。
2、创建输出流
3、完成上传。
注意:part.getName()获得的并不是上传的文件名,而是上传项的名。要活的上传的文件名,需要获取Content-Disposition后面的字符串,之后操作字符串得到。具体实现看如下代码。
[Java] 纯文本查看 复制代码 private void Upload2(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
Part part = request.getPart("upload");
String name = part.getName();
String header = part.getHeader("Content-Disposition");
int i = header.lastIndexOf("filename=\"");
//获取上传的文件名
String fileName = header.substring(i+10, header.length()-1);
System.out.println("文件名大小是:"+part.getSize());
System.out.println("文件名是:"+fileName+"=====文件上传项的value属性值是:"+name);
System.out.println("文件头信息Content-Disposition是:"+header);
//获取输入流
InputStream is = part.getInputStream();
String realPath = request.getServletContext().getRealPath("/upload");
//创建输出流
FileOutputStream os = new FileOutputStream(realPath+"/"+fileName);
//读写操作
byte[] byts = new byte[1024];
int len = 0;
while ( (len = is.read(byts)) != -1 ) {
os.write(byts, 0, len);
}
//IOUtils.copy(is, os);
//关闭流
os.close();
is.close();
}
多学一招:
我们看代码的关于读写的操作,用了五行代码。比较繁琐,在commons-io-1.4.jar中给我们提供了关于复制的操作,一行代码就能搞定。就是IOUtils.copy(is, os)。
附件为commons-io-1.4.jar的jar包。
|