上周为项目增加了文件上传功能,用于接收http接口上传的文件。现将一些心得与总结记录下来。
项目使用环境:JDK6、Tomcat6
我尝试过两种方式来实现文件上传的功能,分别为common-fileupload与spingMVC的文件上传。
方式一、common-fileupload实现文件上传
相关jar包:commons-fileupload-1.3.1.jar,commons-io-1.4.jar
/** * 1.获取项目所在路径 * 2.构建文件存放路径 * 3.构建文件相对路径 * 4.设置request的字符集 * 5.创建磁盘文件工厂 * 6.设置缓冲大小、上传文件大小限制、临时文件夹 * 7.得到上传文件名 * 8.将文件保存到服务器端 * @throws UnsupportedEncodingException */ public void fileUpload(HttpServletRequest request, String fload) throws Exception { Date currData = new Date(); SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); String classPath=this.getClass().getClassLoader().getResource("").getPath(); String projectPath=classPath.substring(0, classPath.length()-"/WEB-INF/classes/".length()); String projectName=projectPath.substring(projectPath.lastIndexOf("/")+1); String filePath=projectPath+fload+"/"+sdf.format(currData); //文件存放路径 String relativePath="/"+projectName+fload+"/"+sdf.format(currData); //文件存放相对路径 String tempUploadPath=projectPath+"/"+"tempUpload"; //临时文件夹路径为 System.out.println("文件存放的文件夹为----:"+filePath); System.out.println("文件存放的文件夹相对路径为----:"+relativePath); System.out.println("临时文件夹路径为----:"+tempUploadPath); request.setCharacterEncoding("UTF-8"); final long MAX_SIZE=100 * 1024 * 1024; //上传文件大小限制 DiskFileItemFactory dfif = new DiskFileItemFactory(); // 实例化一个硬盘文件工厂,用来配置上传组件ServletFileUpload dfif.setSizeThreshold(40960000); // 设置缓冲(字节),这个值决定了是fileinputstream还是bytearrayinputstream File tempUploadFload = new File(tempUploadPath); if(!tempUploadFload.isDirectory()){ tempUploadFload.mkdirs(); } dfif.setRepository(tempUploadFload); //设置临时文件夹路径 ServletFileUpload sfu = new ServletFileUpload(dfif); sfu.setFileSizeMax(MAX_SIZE); //设置上传文件大小 sfu.setHeaderEncoding("UTF-8"); List<FileItem> fils=null; try { fils = sfu.parseRequest(request); } catch (Exception e) { e.printStackTrace(); } Iterator<FileItem> fileite = fils.iterator(); String fileName=""; String fileType=""; String fileAllPath=""; String relativeAllPath=""; long fileSize=0L; while(fileite.hasNext()){ FileItem fileItem = fileite.next(); if(fileItem==null || fileItem.isFormField() ){ //忽略简单form字段 continue; } String path = fileItem.getName() ; fileSize = fileItem.getSize(); fileName=(path.lastIndexOf("/")!=-1)?path.substring(path.lastIndexOf("/")+1):path; //得到上传文件名 fileType=path.substring(path.lastIndexOf(".")+1); //文件类型 fileAllPath=filePath+"/"+fileName; //文件全路径 relativeAllPath=filePath+"/"+fileName; //文件相对路径 System.out.println("文件全路径为-----:"+fileAllPath); if(fileName!=null&&!"".equals(fileName.trim())){ File uploadFileFload = new File(filePath); File uploadFile = new File(fileAllPath); if(!uploadFileFload.isDirectory()){ boolean falg = uploadFileFload.mkdirs(); System.out.println("文件夹创建状态-----:"+falg); }else{ System.out.println("文件保存在------:"+filePath); } fileItem.write(uploadFile); //写入文件 System.out.println("文件上传成功,文件名为: "+fileName+" 大小为: "+fileSize+"字节"); }else{ System.out.println("文件上传失败"); } } }
方式一的心得:
1.服务器端与客户端的编码要一致,否则上传包含有中文的文件的文件名会乱码。
2.设置了缓存大小后,如果上传的文件大于缓存设置。则会先上传到临时文件夹,当调用write方法时才写入到指定路径中,以节省内存占用。
3.上传文件夹要先创建好,然后再写入文件。这个是容易忽略的。
4.在springMVC等框架中,parseRequest返回的结果如果为空,则是框架已经对对包含了文件输入流的requet进行了处理。我们得到的已经不是原始的request,所以变会为空了。笔者在使用第一种方法的时候就遇到这个问题,遂使用方式二。
方式二、使用springMVC的文件上传
实际上spingMVC对request的解析也是用common-fileupload中的parseRequest方法,这也就是方式一中parseRequest为空的原因。spingMVC已经帮我们处理了。
首先我们需要现在application-content.xml中添加该类,使用该类处理后,与上传相关的设置是在xml中配置的。
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"/>
之后的处理就比较简单了,以下是实现。
public List<Map<String,String>> mvcFileUpload(HttpServletRequest request, String fload) throws IllegalStateException, IOException{ Date currData = new Date(); SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); String classPath=this.getClass().getClassLoader().getResource("").getPath(); String projectPath=classPath.substring(0, classPath.length()-"/WEB-INF/classes/".length()); String projectName=projectPath.substring(projectPath.lastIndexOf("/")+1); String filePath=projectPath+fload+"/"+sdf.format(currData); //文件夹存放路径 String relativePath="/"+projectName+fload+"/"+sdf.format(currData); //文件夹存放相对路径 String fileAllPath=null; //文件存放路径 String relativeAllPath=null; //文件存放相对路径 System.out.println("文件存放的文件夹为----:"+filePath); System.out.println("文件存放的文件夹相对路径为----:"+relativePath); File saveFolder = new File(filePath); if(!saveFolder.isDirectory()){ boolean falg = saveFolder.mkdirs(); System.out.println("文件夹创建状态-----:"+falg); } String realFileName=null; //真实上传文件名 String fileType=null; //文件类型 List<Map<String,String>> result=new ArrayList<Map<String,String>>(); MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request; Iterator<String> fileNameIte = multipartRequest.getFileNames(); while(fileNameIte.hasNext()){ String fileName = fileNameIte.next(); MultipartFile mr = multipartRequest.getFile(fileName); realFileName = mr.getOriginalFilename(); if(StringUtils.isNotBlank(realFileName)){ System.out.println("上传的文件名为-----:"+realFileName); fileType=realFileName.substring(realFileName.lastIndexOf(".")+1); realFileName=realFileName.substring(0, realFileName.lastIndexOf("."))+"-"+System.nanoTime()+"."+fileType; //对上传文件进行重命名 fileAllPath=filePath+"/"+realFileName; relativeAllPath=relativePath+"/"+realFileName; File localFile = new File(fileAllPath); mr.transferTo(localFile); Map<String, String> map = new HashMap<String, String>(); map.put("fileName", realFileName); map.put("fileType", fileType); map.put("fileAllPath", fileAllPath); map.put("relativeAllPath", relativeAllPath); result.add(map); } } return result; }
但笔者发现spingMVC处理的并不完善,当向相同路径重新上传相同文件名的文件时。会出现阻塞,可能是在处理的过程中没有关闭流,解决的办法就是对上传的每个文件进行重命名。
相关推荐
这个"最全的common-FileUpload.jar包"结合了两个关键的Apache Commons库,为开发者提供了强大的文件上传解决方案,无论是小型项目还是大型企业级应用,都能从中受益。通过深入理解和有效利用这些工具,可以极大地...
本篇文章将详细讲解如何使用`Commons-FileUpload`进行文件上传,并读取上传文件的内容。 首先,了解`Commons-FileUpload`的工作原理。它解析HTTP请求,将多部分的数据分割成单独的部分,这些部分可以是文本或文件。...
总的来说,利用`Common-fileupload`,开发者可以方便地在Java Web应用中实现文件上传功能。这个库提供了多部分解析器,可以处理大文件的分块上传,避免一次性加载整个文件到内存中。它还支持设置上传限制,防止恶意...
commons-fileupload-1.2.2commons-fileupload-1.2.2commons-fileupload-1.2.2commons-fileupload-1.2.2commons-fileupload-1.2.2commons-fileupload-1.2.2commons-fileupload-1.2.2commons-fileupload-1.2.2commons-...
开发工具 commons-fileupload-1.3.2开发工具 commons-fileupload-1.3.2开发工具 commons-fileupload-1.3.2开发工具 commons-fileupload-1.3.2开发工具 commons-fileupload-1.3.2开发工具 commons-fileupload-1.3.2...
在IT行业中,文件上传是...开发者可以通过Struts2的配置和Action类设计,结合Commons FileUpload的多部分解析能力,实现高效且安全的文件上传功能。同时,理解并掌握这两者的使用有助于提高Java Web开发的效率和质量。
描述中提及的"commons-io-2.2"是Apache Commons IO库的2.2版本,这是一个非常实用的Java I/O工具集,包含了大量与输入/输出相关的实用类,如文件操作、流操作、转换和比较等,它是FileUpload库的一个依赖,提供了...
在"Common-FileUpload实现文件上传.doc"文档中,可能会详细介绍如何利用这个库来处理用户的文件上传请求。Common-FileUpload提供了一套完整的API,用于解析请求中的多部分数据,从而提取上传的文件。使用它,开发者...
本实验报告将详细阐述如何利用SpringMVC实现文件上传与下载的功能。 首先,文件上传的核心在于HTML表单(form)的正确配置。在创建用于上传文件的表单时,需要指定`enctype`属性为`multipart/form-data`。这是因为...
common-fileupload官方文档
赠送Maven依赖信息文件:commons-fileupload-1.3.3.pom; 包含翻译后的API文档:commons-fileupload-1.3.3-javadoc-API文档-中文(简体)版.zip; Maven坐标:commons-fileupload:commons-fileupload:1.3.3; 标签:...
在Java开发中,`common...总之,`common-io`和`common-fileupload`是Java开发中的强大工具,它们简化了常见的I/O操作和文件上传处理,提高了开发效率。了解并熟练运用这些库,能帮助开发者更好地应对实际项目中的挑战。
在Java Web开发中,文件的上传与下载是常见的功能需求,尤其...通过以上步骤,你可以实现基于Java Servlet和Apache Commons库的文件上传与下载功能。理解并熟练掌握这些知识点,对于开发高效、稳定的Web应用至关重要。
### Common-fileupload组件实现文件上传 #### 一、概述 在现代Web开发中,文件上传是一项常见的需求。尤其是在Java Web应用程序中,实现文件上传功能变得越来越简单,这得益于丰富的开源库支持。Common-fileupload...
赠送Maven依赖信息文件:commons-fileupload-1.4.pom; 包含翻译后的API文档:commons-fileupload-1.4-javadoc-API文档-中文(简体)版.zip; Maven坐标:commons-fileupload:commons-fileupload:1.4; 标签:...
3. Common-FileUpload库:这个库可能是一个专门为实现带进度条文件上传功能而设计的开源组件。它可能包含JavaScript、CSS和HTML代码,用于构建用户界面,以及后端处理逻辑。使用此类库可以简化开发者的工作,避免从...
在`MyProject`这个压缩包中,可能包含了使用`common-fileupload`进行文件上传和下载的示例代码,你可以解压后查看具体实现。通过阅读和理解代码,可以更好地掌握文件上传下载的实践应用。在实际开发中,结合源码和...
用commons-fileupload-1.2.1.jar上传文件 用commons-fileupload-1.2.1.jar上传文件 用commons-fileupload-1.2.1.jar上传文件 用commons-fileupload-1.2.1.jar上传文件
在上述例子中,我们看到了使用Commons FileUpload实现文件上传的步骤: 1. 创建上传页面:HTML表单使用`enctype="multipart/form-data"`属性,指定上传文件的类型。在`<input type="file">`标签中,用户可以选择要...
common-fileupload控件不能删除临时文件的原因分析 1.分析原因 2.出现条件 3.过程分析 4.解决办法