JavaWeb---文件上传
目录
1.文件上传的作用
2.文件上传对页面的要求
3.fileupload
4.简单上传示例
1.文件上传的作用
在现实中,我们经常需要客户端向服务器上传一些资源,比如,我们使用QQ时,可以设置头像,那我们就需要从我们本地电脑(客户端)向QQ服务器来上传我们喜欢的头像.还比如现在很流行的百度云盘,也需要我们往百度云盘的服务器上传资源,比如小电影,小图片等等。
2.文件上传对页面的要求
前端要求:
1.form 提交方式:post method="post"
2.form的enctype="application/x-www-form-urlencoded"默认值, 对表单的数据进行url编码,
enctype设置为: multipart/form-data
3.使用
选择文件
后端要求:
1.获取请求参数, request.getParameter()一组失效
2. 导入commons-fileupload.jar commons-io
1.导入jar: commons-fileupload.jar commons-io.jar
2.编写servlet代码
Fileupload的核心类: DiskFileItemFactory(产生FiledItem的工厂)、ServletFileUpload(解析request,得到FiledItem)、FiledItem(对应的表单的input,select)。
request.getParameter() 方法失效
创建 DiskFileItemFactory工厂对象: DiskFileItemFactory factory = new DiskFileItemFactory()
通过工厂对象, 创建ServletFileUpload对象: ServletFileUpload servletFileUpload = new ServletFileUpload(factory )
使用ServletFileUpload对象解析request对象
List
servletFileUpload .parseRequest(request);
DiskFileItemFactory factory = new DiskFileItemFactory();//2.通过工厂得到ServletFileUpload对象ServletFileUpload servletFileUpload = new ServletFileUpload(factory);try {//3.解析requestList fileItems = servletFileUpload.parseRequest(request);} catch (FileUploadException e) {e.printStackTrace();}
上传文件细节:
数据库表存的上传文件的保存路径
上传的文件,保存到服务器的硬盘, 保存的文件的文件名直接上传文件名,出现问题,如果用户上传的文件名在服务器硬盘已存在, 后面的文件覆盖前面的, 解决方案: 保存的文件的文件名由服务器分配, 分配策略唯一: 时间戳 , UUID
3.fileupload
fileupload是由apache的commons组件提供的上传组件。它最主要的工作就是帮我们解析request.getInputStream()。
fileupload组件需要的JAR包有:
commons-fileupload.jar,核心包;
commons-io.jar,依赖包。
fileupload方法:
String getName():获取文件字段的文件名称;
String getString():获取字段的内容,如果是文件字段,那么获取的是文件内容,当然上传的文件必须是文本文件;
String getFieldName():获取字段名称,例如:,返回的是username;
String getContentType():获取上传的文件的类型,例如:text/plain。
int getSize():获取上传文件的大小;
boolean isFormField():判断当前表单字段是否为普通文本字段,如果返回false,说明是文件字段;
InputStream getInputStream():获取上传文件对应的输入流;
void write(File):把上传的文件保存到指定文件中。
4.简单上传示例
需求:
-
表单包含一个用户名字段,以及一个文件字段;
-
Servlet保存上传的文件到uploads目录,显示用户名,文件名,文件大小,文件类型。
代码编写:
第一步:
完成index.jsp,只需要一个表单。注意表单必须是post的,而且enctype必须是mulitpart/form-data的。
第二步:
完成FileUploadServlet
public void doPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {// 因为要使用response打印,所以设置其编码response.setContentType("text/html;charset=utf-8");// 创建工厂DiskFileItemFactory dfif = new DiskFileItemFactory();// 使用工厂创建解析器对象ServletFileUpload fileUpload = new ServletFileUpload(dfif);try {// 使用解析器对象解析request,得到FileItem列表List list = fileUpload.parseRequest(request);// 遍历所有表单项for(FileItem fileItem : list) {// 如果当前表单项为普通表单项if(fileItem.isFormField()) {// 获取当前表单项的字段名称String fieldName = fileItem.getFieldName();// 如果当前表单项的字段名为usernameif(fieldName.equals("username")) {// 打印当前表单项的内容,即用户在username表单项中输入的内容response.getWriter().print("用户名:" + fileItem.getString() + "
");}} else {//如果当前表单项不是普通表单项,说明就是文件字段String name = fileItem.getName();//获取上传文件的名称// 如果上传的文件名称为空,即没有指定上传文件if(name == null || name.isEmpty()) {continue;}// 获取真实路径,对应${项目目录}/uploads,当然,这个目录必须存在String savepath = this.getServletContext().getRealPath("/uploads");// 通过uploads目录和文件名称来创建File对象File file = new File(savepath, name);// 把上传文件保存到指定位置fileItem.write(file);// 打印上传文件的名称response.getWriter().print("上传文件名:" + name + "
");// 打印上传文件的大小response.getWriter().print("上传文件大小:" + fileItem.getSize() + "
");// 打印上传文件的类型response.getWriter().print("上传文件类型:" + fileItem.getContentType() + "
");}}} catch (Exception e) {throw new ServletException(e);} }
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
