文件上传
1.文件上传
问题:什么是文件上传?为什么使用文件上传?
就是将客户端资源,通过网络传递到服务器端。
就是因为数据比较大,我们必须通过文件上传才可以完成将数据保存到服务器端操作.
文件上传的本质:就是IO流的操作。
上传应该 怎样操作?
浏览器端:
1.method=post 只有post才可以携带大数据
2.必须使用<input type='file' name='f'>要有name属性
3.encType="multipart/form-data"
服务器端:
request对象是用于获取请求信息。
它有一个方法 getInputStream(); 可以获取一个字节输入流,通过这个流,可以读取到
所有的请求正文信息.
文件上传原理:
浏览器端注意上述三件事,在服务器端通过流将数据读取到,在对数据进行解析.
将上传文件内容得到,保存在服务器端,就完成了文件上传。
在实际开发中,不需要我们进行数据解析,完成文件上传。因为我们会使用文件上传的工具,它们已经封装好的,
提供API,只要调用它们的API就可以完成文件上传操作.
我们使用的commons-fileupload,它是apache提供的一套开源免费的文件上传工具。
使用commons-fileupload
1.导入jar包
commons-fileupload-1.2.1.jar 文件上传
commons-io-1.4.jar 它是提供的io工具.
介绍commons-fileupload
它有三个核心
1.DiskFileItemFactory类
2.ServletFileUpload类
3.FileItem
2.快速入门:
1.创建upload2.jsp页面
<form action="${pageContext.request.contextPath}/upload2" method="post" encType="multipart/form-data">
<input type="file" name="f"><br>
<input type="submit" value="上传">
</form>
2.创建Upload2Servlet
1.创建一个DiskFileItemFactory
DiskFileItemFactory factory=new DiskFileItemFactory();
2.创建ServletFileUpload类
ServletFileUpload upload=new ServletFileUpload(factory);
3.解析所有上传数据
List<FileItem> items = upload.parseRequest(request);
3.了遍历items集合,集合中的每一项,就是一个上传数据.
1.isFormField();
2.getFieldName();
返回值String,得到组件名称 <input name="">
3.getName();
返回值是String,得到的是上传文件的名称.
注意:浏览器不同,它们得到的效果不一样。
1.包含全路径名称 例如: C:\Users\Administrator\Desktop\a.txt
2.只包含上传文件名称 例如:a.txt
4.getString();
这个方法可以获取非上传组件的内容,相当于 getParameter方法作用。
如果是上传组件,上传的文件是文本文件,可以获取到文件文件的内容。
但是如果不是文件文件,例如:是一张图片,这样获取合适吗?
5.获取上传文件的内容,保存到服务器端.
item.getInputStream();它是用于读取上传文件内容的输入流.
使用文件复制操作就可以完成文件上传。
IOUtils.copy(item.getInputStream(), fos);

浙公网安备 33010602011771号