这篇文章主要介绍了Java中使用fileupload组件实现文件上传功能的实例代码,需要的朋友可以参考下
使用fileupload组件的原因:
Request对象提供了一个getInputStream()方法,通过这个方法可以读取到客户端提交过来的数据,但是由于用户可能会同时上传多个文件,在servlet中编程解析这些上传数据是一件非常麻烦的工作。为方便开发人员处理文件上传数据,Apache开源组织提供了一个用来处理表单文件上传的一个开源组件(Commons-fileupload),该组件性能优异,并且使用及其简单,可以让开发人员轻松实现web文件上传功能。
使用Commons-fileupload组件实现文件上传,需要导入该组件相应的支撑jar包:
commons-fileupload和connons-io
(commons-upload组件从1.1版本开始,它的工作需要commons-io包的支持)
FileUpload组件工作流程:
相应的代码框架为:
package pers.msidolphin.uploadservlet.web; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.UnsupportedEncodingException; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; import java.util.List; import java.util.UUID; 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.disk.DiskFileItemFactory; import org.apache.commons.fileupload.servlet.ServletFileUpload; /** * Servlet implementation class UploadServlet */ public class UploadServlet extends HttpServlet { private static final long serialVersionUID = 1L; /** * @see HttpServlet#HttpServlet() */ public UploadServlet() { super(); } /** * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response) */ protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //获取解析工厂 DiskFileItemFactory factory = new DiskFileItemFactory(); //得到解析器 ServletFileUpload parser = new ServletFileUpload(factory); //解决文件名乱码问题 parser.setHeaderEncoding("UTF-8"); //判断上传表单类型 if(!ServletFileUpload.isMultipartContent(request)) { return; } try { //调用解析器解析上传数据 List<FileItem> fileItems = parser.parseRequest(request); //获得保存上传文件目录的路径 String uploadPath = request.getServletContext().getRealPath("/WEB-INF/upload"); //遍历List集合 for (FileItem fileItem : fileItems) { //判断是否为普通表单字段 if(fileItem.isFormField()) { //如果是普通表单字段则打印到控制台 if(fileItem.getString() == null || "".equals(fileItem.getString().trim())) { continue; } System.out.println(fileItem.getFieldName() + " = " + new String(fileItem.getString().getBytes("ISO-8859-1"), "UTF-8")); }else { //获得文件路径 String filePath = fileItem.getName(); //如果并未上传文件,继续处理下一个字段 if(filePath == null || "".equals(filePath.trim())) { continue; } System.out.println("处理文件:" + filePath); //截取文件名 String fileName = filePath.substring(filePath.lastIndexOf("\\") + 1); String reallyName = this.createFileName(fileName); String reallyPath = this.mkDir(reallyName, uploadPath); //下面都是普通的IO操作了 InputStream in = fileItem.getInputStream(); FileOutputStream out = new FileOutputStream(reallyPath + "\\" + reallyName); byte[] buffer = new byte[1024]; int len = 0; while((len = in.read(buffer)) > 0) { out.write(buffer, 0, len); } out.close(); in.close(); } } System.out.println("处理完毕..."); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } /** * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response) */ protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); } //随机产生唯一的文件名 private String createFileName(String fileName) throws NoSuchAlgorithmException, UnsupportedEncodingException { String extension = fileName.substring(fileName.lastIndexOf(".")); MessageDigest md = MessageDigest.getInstance("md5"); String currentTime = System.currentTimeMillis() + ""; return UUID.randomUUID() + currentTime + extension; } //根据哈希值产生目录 private String mkDir(String fileName, String uploadPath) { int hasCode = fileName.hashCode(); //低四位作为一级目录 int parentDir = hasCode & 0xf; //二级目录 int childDir = hasCode & 0xff >> 2; File file = new File(uploadPath + "\\" + parentDir + "\\" + childDir); if(!file.exists()) { file.mkdirs(); } uploadPath = uploadPath + "\\" + parentDir + "\\" + childDir; return uploadPath; } }
JSP页面 :
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> <%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt" %> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Insert title here</title> </head> <body> <fmt:setBundle basename="pers.msidolphin.uploadservlet.lang.locale" var="bundle" scope="page"/> <form action="<c:url value="/UploadServlet"/>" method="post" enctype="multipart/form-data"> <fmt:message key="username" bundle="${bundle}"/><input type="text" name="username"/> <br/> <br/> <fmt:message key="file1" bundle="${bundle}"/><input type="file" name="file1"/> <br/> <br/> <fmt:message key="file2" bundle="${bundle}"/><input type="file" name="file2"/> <br/> <br/> <input type="submit" value="<fmt:message key="submit" bundle="${bundle}"/>"/> </form> </body> </html>
核心API: DiskFileItemFactory类
//设置内存缓冲区的大小,默认为10K,当上传文件大小大于缓冲区大小,fileupload组件将使用临时文件缓存上传文件 public void setSizeThreshold(int sizeThreshold); //指定临时文件目录 默认值为System.getProperty("java.io.tmpdir") public void setRepository(java.io.file respository); //构造方法 public DiskFileItemFactory(int sizeThreshold, java.io.file respository);
核心API: ServletFileUpload类
//判断上传表单是否为multipart/form-data类型 boolean isMultipartContent(HttpServletRequest request); //解析request对象,并把表单中的每一个输入项包装成一个fileitem对象,返回这些对象的list集合 List<FileItem> parseRequest(HttpServletRequest request); //设置上传文件总量的最大值 单位:字节 void setSizeMax(long sizeMax); //设置单个上传文件的最大值 单位:字节 void setFileSizeMax(long fileSizeMax); //设置编码格式,用于解决上传文件名的乱码问题 void setHeaderEncoding(String encoding); //设置文件上传监听器,作用是实时获取已上传文件的大小 void setProgressListener(ProgressListener pListener);
核心API: FileItem类
//判断表单输入项是否为普通输入项(非文件输入项,如果是普通输入项返回true boolean isFormField(); //获取输入项名称 String getFieldName(); //获得输入项的值 String getString(); String getString(String encoding); //可以设置编码,用于解决数据乱码问题 以下是针对非普通字段的: //获取完整文件名(不同的浏览器可能会有所不同,有的可能包含路径,有的可能只有文件名) String getName(); //获取文件输入流 InputStream getInputStream();
文件上传的几个注意点:
1、上传文件的文件名乱码问题:ServletFileUpload对象提供了setHeaderEncoding(String encoding)方法可以解决中文乱码问题
2、上传数据的中文乱码问题:
解决方法一:new String(fileItem.getString().getBytes(“ISO-8859-1”), “UTF-8”)
解决方法二:fileItem.getString(“UTF-8”)
解决方法三:fileItem.getString(request.getCharacterEncoding())
3、上传文件名的唯一性:UUID、MD5解决方法很多…
4、保存上传文件的目录最好不要对外公开
5、限制上传文件的大小: ServletFileUpload对象提供了setFileSizeMax(long fileSizeMax)和setSizeMax(long sizeMax)方法用于解决这个问题
6、限制文件上传类型:截取后缀名进行判断(好像不太严格,还要研究一番…)
以上是fileupload组件实现文件上传功能在Java中使用的实例代码的详细内容。更多信息请关注PHP中文网其他相关文章!

新兴技术对Java的平台独立性既有威胁也有增强。1)云计算和容器化技术如Docker增强了Java的平台独立性,但需要优化以适应不同云环境。2)WebAssembly通过GraalVM编译Java代码,扩展了其平台独立性,但需与其他语言竞争性能。

不同JVM实现都能提供平台独立性,但表现略有不同。1.OracleHotSpot和OpenJDKJVM在平台独立性上表现相似,但OpenJDK可能需额外配置。2.IBMJ9JVM在特定操作系统上表现优化。3.GraalVM支持多语言,需额外配置。4.AzulZingJVM需特定平台调整。

平台独立性通过在多种操作系统上运行同一套代码,降低开发成本和缩短开发时间。具体表现为:1.减少开发时间,只需维护一套代码;2.降低维护成本,统一测试流程;3.快速迭代和团队协作,简化部署过程。

Java'splatformindependencefacilitatescodereusebyallowingbytecodetorunonanyplatformwithaJVM.1)Developerscanwritecodeonceforconsistentbehavioracrossplatforms.2)Maintenanceisreducedascodedoesn'tneedrewriting.3)Librariesandframeworkscanbesharedacrossproj

要解决Java应用程序中的平台特定问题,可以采取以下步骤:1.使用Java的System类查看系统属性以了解运行环境。2.利用File类或java.nio.file包处理文件路径。3.根据操作系统条件加载本地库。4.使用VisualVM或JProfiler优化跨平台性能。5.通过Docker容器化确保测试环境与生产环境一致。6.利用GitHubActions在多个平台上进行自动化测试。这些方法有助于有效地解决Java应用程序中的平台特定问题。

类加载器通过统一的类文件格式、动态加载、双亲委派模型和平台无关的字节码,确保Java程序在不同平台上的一致性和兼容性,实现平台独立性。

Java编译器生成的代码是平台无关的,但最终执行的代码是平台特定的。1.Java源代码编译成平台无关的字节码。2.JVM将字节码转换为特定平台的机器码,确保跨平台运行但性能可能不同。

多线程在现代编程中重要,因为它能提高程序的响应性和资源利用率,并处理复杂的并发任务。JVM通过线程映射、调度机制和同步锁机制,在不同操作系统上确保多线程的一致性和高效性。


热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

Video Face Swap
使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热门文章

热工具

SublimeText3汉化版
中文版,非常好用

SublimeText3 英文版
推荐:为Win版本,支持代码提示!

SublimeText3 Linux新版
SublimeText3 Linux最新版

WebStorm Mac版
好用的JavaScript开发工具

mPDF
mPDF是一个PHP库,可以从UTF-8编码的HTML生成PDF文件。原作者Ian Back编写mPDF以从他的网站上“即时”输出PDF文件,并处理不同的语言。与原始脚本如HTML2FPDF相比,它的速度较慢,并且在使用Unicode字体时生成的文件较大,但支持CSS样式等,并进行了大量增强。支持几乎所有语言,包括RTL(阿拉伯语和希伯来语)和CJK(中日韩)。支持嵌套的块级元素(如P、DIV),