Web的文件上传
一、上传
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、上传会让request.getParametere("xxx")方法失效,此时将上传表单项分为普通表单项和文件表单项。
普通表单项:
> 1个头:Content-Disposition:包含name="xxxx",即表单项名称。
> 体就是表单项的值
文件表单项:
> 2个头:
* Content-Disposition:包含name="xxxx",即表单项名称;还有一个filename="xxx",表示上传文件的名称
* Content-Type:它是上传文件的MIME类型,
例如:image/pjpeg,表示上传的是图片,图上中jpg扩展名的图片。
> 体就是上传文件的内容。
3、上传步骤
准备工作:导入commons-fileupload.jar, commons-io.jar俩个包
1). 创建工厂:DiskFileItemFactory factory = new DiskFileItemFactory();
2). 创建解析器:ServletFileUpload sfu = new ServletFileUpload(factory);
3). 使用解析器来解析request,得到FileItem集合:List<FileItem> fileItemList = sfu.parseRequest(request);
注意:List的顺序与表单项从上到下的顺序一致。
FileItem常用的方法:
* boolean isFormField():是否为普通表单项!返回true为普通表单项,如果为false即文件表单项!
* String getFieldName():返回当前表单项的名称;
* String getString(String charset):传入编码,返回表单项的值;
* String getName():返回上传的文件名称
* long getSize():返回上传文件的字节数
* InputStream getInputStream():返回上传文件对应的输入流
* String getContentType():获取上传文件类型
* void write(File destFile):把上传的文件内容保存到指定的文件中。
//创建将要保存文件的文件流
File file=new File("C:/Users/13928/Desktop/图标.jpg");
item2.write(file); //将文件流写入服务器
4、上传文件的大小限制
- 单个文件大小限制
> sfu.setFileSizeMax(100*1024):限制单个文件大小为100KB,必须在解析开始之前调用!
> 如果上传的文件超出限制,在parseRequest()方法执行时,会抛出异常!FileUploadBase.FileSizeLimitExceededException
- 整个请求所有数据大小限制
> sfu.setSizeMax(1024 * 1024):限制整个表单大小为1M,必须在解析开始之前调用!
> 如果上传的文件超出限制,在parseRequest()方法执行时,会抛出异常!FileUploadBase.SizeLimitExceededException
5、缓存大小与临时目录
* 缓存大小:上传文件超出多大,才向硬盘保存!默认为10KB
* 临时目录:向硬盘的什么目录保存
设置缓存大小与临时目录:new DiskFileItemFactory(20*1024, new File("E:/temp"));