分享web开发知识

注册/登录|最近发布|今日推荐

主页 IT知识网页技术软件开发前端开发代码编程运营维护技术分享教程案例
当前位置:首页 > IT知识

文件上传

发布时间:2023-09-06 02:24责任编辑:熊小新关键词:文件上传

1.文件上传页面显示

upload.jsp

 ?<body> ???<form action="uploadServlet" method="post" enctype="multipart/form-data"> ?????File:<input type="file" name="file"/> ?????<input type="submit" value="Submit"/> ???</form> ?</body>

进行文件上传时,表单需要做的准备:

①请求方式为post:<form action="uploadServlet" method="post">

②使用file的表单域:<input type="file" name="file"/>

③使用multipart/form-data的请求编码方式:<form action="uploadServlet" method="post" enctype="multipart/form-data">

关于enctype属性取值:

  • application/x-www-form-urlencoded:表单enctype属性的默认值。这种编码方式使用有限的字符集,当使用了非字母和数字时,必须使用“%HH”代替(H代表十六进制数字)。对于大容量的二进制数据或包含非ASCII字符的文本来说,这种编码不能满足需求。
  • multipart/form-data:form设定了enctype="multipart/form-data"属性后,表示表单以二进制传输数据。

服务端不能再使用request.getParameter()等方式获取请求信息,获取不到,因为请求的编码方式已经改为multipart/form-data,以二进制的方式提交请求信息。可以使用输入流的方式来获取,但是不建议这样做,操作起来太麻烦,具体使用commons-fileupload组件来完成文件的上传操作。

2.文件上传操作

2.1 环境搭建

加入commons-fileupload.jar包,commons-io.jar包

commons-io,jar包版本过高容易出现找不到有关类的错误。

2.2 基本思想

  • commons-fileupload可以解析请求,得到一个FileItem对象组成的List;
  • commons-fileupload把所有的请求信息都解析为FileItem对象,无论是一个一般的文本域还是文件域;
  • 可以调用FileItem的isFormField()方法来判断是一个表单域或不是表单域(文件域);
  • 再来进一步获取信息,如果是一个文本,获取名字和值,如果是一个文件的话,获取文件名,contentType,文件大小等。

2.3 如何得到List<FileItem>对象

//create a factory for disk-based file itemsDiskFileItemFactory factory = new DiskFileItemFactory();//create s new file upload handlerServletFileUpload upload = new ServletFileUpload(factory);//parse the requestList fileItems = upload.parseRequest(req);

也可以为文件的上传加入一些限制和其他的属性。

 DiskFileItemFactory factory = new DiskFileItemFactory(); // 设置内存中最多可以存放的上传文件的大小,若超出则把文件写到一个临时的文件夹中,以byte为单位 factory.setSizeThreshold(4096); // 设置临时文件夹的位置 factory.setRepository(new File("/tmp")); ServletFileUpload upload = new ServletFileUpload(factory); // 设置上传文件的总的大小,也可以设置单个文件的大小 upload.setSizeMax(1000000); List fileItems = upload.parseRequest(req);

 2.4 实例代码

index.jsp

 ?<body> ???<a href="jspPage/upload.jsp">上传文件</a> ???<br><br> ???<a href="jspPage/download.jsp">下载文件</a> ?</body>

upload.jsp

 ?<body> ???<form action="uploadServlet" method="post" enctype="multipart/form-data"> ?????File:<input type="file" name="file"/> ?????<input type="submit" value="Submit"/> ???</form> ?</body>

uploadServlet.java

package com.javaweb.file;import java.io.File;import java.io.FileOutputStream;import java.io.IOException;import java.io.InputStream;import java.io.OutputStream;import java.util.List;import javax.servlet.ServletException;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import org.apache.commons.fileupload.FileItem;import org.apache.commons.fileupload.FileUploadException;import org.apache.commons.fileupload.disk.DiskFileItemFactory;import org.apache.commons.fileupload.servlet.ServletFileUpload;public class uploadServlet extends HttpServlet {public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //1.得到FileItem的集合items DiskFileItemFactory factory = new DiskFileItemFactory(); // 设置内存中最多可以存放的上传文件的大小,若超出则把文件写到一个临时的文件夹中,以byte为单位 factory.setSizeThreshold(1024*500); // 设置临时文件夹的位置 File temDirectory=new File("e:\\"); factory.setRepository(temDirectory); ServletFileUpload upload = new ServletFileUpload(factory); // 设置上传文件的总的大小,也可以设置单个文件的大小 upload.setSizeMax(1024*1024*5); try { //2.遍历items:若是一个一般的表单域,打印信息,若是文件域,则把文件保存到指定的磁盘位置List<FileItem> fileItems = upload.parseRequest(request);for(FileItem fileItem:fileItems){if(fileItem.isFormField()){String name=fileItem.getFieldName();String value=fileItem.getString();System.out.println(name+":"+value);}else{String fieldName=fileItem.getFieldName();String fileName=fileItem.getName();String contentType=fileItem.getContentType();long sizeInBytes=fileItem.getSize();System.out.println(fieldName);System.out.println(fileName);System.out.println(contentType);System.out.println(sizeInBytes); ???InputStream in=fileItem.getInputStream(); ???byte[] buffer=new byte[1024]; ???int len=0; ???//fileName="e:\\"+fileName; ???OutputStream out=new FileOutputStream(fileName); ???while((len=in.read(buffer))!=-1){ ???out.write(buffer,0,len); ???} ???out.close(); ???in.close();}}} catch (FileUploadException e) {e.printStackTrace();}}}

在web.xml中进行配置:

<servlet> <servlet-name>uploadServlet</servlet-name> <servlet-class>com.javaweb.file.uploadServlet</servlet-class></servlet><servlet-mapping> <servlet-name>uploadServlet</servlet-name> <url-pattern>/uploadServlet</url-pattern></servlet-mapping>

运行后,

文件上传

原文地址:https://www.cnblogs.com/naihuangbao/p/9998231.html

知识推荐

我的编程学习网——分享web前端后端开发技术知识。 垃圾信息处理邮箱 tousu563@163.com 网站地图
icp备案号 闽ICP备2023006418号-8 不良信息举报平台 互联网安全管理备案 Copyright 2023 www.wodecom.cn All Rights Reserved