1. 上传对表单限制
* method="post"
* enctype="multipart/form-data"
* 表单中需要添加文件表单项:<input type="file" name="xxx" />
<form action="xxx" method="post" enctype="multipart/form-data">
用户名;<input type="text" name="username"/><br/>
照 片:<input type="file" name="zhaoPian"/><br/>
<input type="submit" value="上传"/>
</form>
2. 上传对Servlet限制
* request.getParametere("xxx");这个方法在表单为enctype="multipart/form-data"时,它作废了。它永远都返回null
* ServletInputStream request.getInputStream();包含整个请求的体!
多部件表单的体
1. 每隔出多个部件,即一个表单项一个部件。
2. 一个部件中自己包含请求头和空行,以及请求体。
3. 普通表单项:
> 1个头:Content-Disposition:包含name="xxxx",即表单项名称。
> 体就是表单项的值
4. 文件表单项:
> 2个头:
* Content-Disposition:包含name="xxxx",即表单项名称;还有一个filename="xxx",表示上传文件的名称
* Content-Type:它是上传文件的MIME类型,例如:image/pjpeg,表示上传的是图片,图上中jpg扩展名的图片。
> 体就是上传文件的内容。
-----------------------------7e0d2950c62
Content-Disposition: form-data; name="username"
鐙?
-----------------------------7e0d2950c62
Content-Disposition: form-data; name="picture"; filename="dog.jpg"
Content-Type: image/pjpeg
1. 上传三步
相关类:
* 工厂:DiskFileItemFactory
* 解析器:ServletFileUpload
* 表单项:FileItem
1). 创建工厂:DiskFileItemFactory factory = new DiskFileItemFactory();
2). 创建解析器:ServletFileUpload sfu = new ServletFileUpload(factory);
3). 使用解析器来解析request,得到FileItem集合:List<FileItem> fileItemList = sfu.parseRequest(request);
2. FileItem
* boolean isFormField():是否为普通表单项!返回true为普通表单项,如果为false即文件表单项!
* String getFieldName():返回当前表单项的名称;
* String getString(String charset):返回表单项的值;
* String getName():返回上传的文件名称
* long getSize():返回上传文件的字节数
* InputStream getInputStream():返回上传文件对应的输入流
* void write(File destFile):把上传的文件内容保存到指定的文件中。
* String getContentType();
<h1>上传1</h1>
<form action="<c:url value='/UploadServlet'/>" method="post" enctype="multipart/form-data">
用户名:<input type="text" name="username" /><br />
照片:<input type="file" name="picture" /><br />
<input type="submit" value="上传" />
</form>
public class UploadServlet extends HttpServlet {
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
request.setCharacterEncoding("utf-8");
response.setContentType("text/html;charset=utf-8");
/*
* 上传包括三步:
* 1. 创建工厂
* 2. 通过工厂创建解析器
* 3. 解析request,得到FileItem集合
* 4. 遍历FileItem集合,调用其API完成文件的保存
*/
DiskFileItemFactory factory =new DiskFileItemFactory();
ServletFileUpload sfu=new ServletFileUpload(factory);
try {
List <FileItem> fileItemList=sfu.parseRequest(request);
FileItem fi1=fileItemList.get(0);
FileItem fi2=fileItemList.get(1);
System.out.println("普通表单项:"+fi1.getFieldName()+"="
+fi1.getString("utf-8"));
System.out.println("文件表单项:");
System.out.println("Content-Type:"+fi2.getContentType());
System.out.println("size:"+fi2.getSize());
System.out.println("filename:"+fi2.getName());
//保存文件
File file=new File("E:/1.jpg");
fi2.write(file);
} catch (Exception e) {
// TODO Auto-generated catch block
throw new RuntimeException(e);
}
}
}