目的:
为一劳永逸,经过多方参考,特写此java通用文件上传工具类
------------------------------------------------------------------------
所需jar包
commons-fileupload-1.2.2.jar
commons-io-2.0.1.jar
------------------------------------------------------------------------
代码说明:
上传文件默认保存路径为:
.../basePath/dirName/yyyyMMdd/fileName.abc
.../upload/images/yyyyMMdd/yyyyMMddHHmmss_xyz.abc(xyz为0-1000之内的随机数,abc为文件名)
其中:
basePath-->upload
dirName-->images
fileName-->若不指定文件名,默认为yyyyMMddHHmmss_xyz
extMap-->允许的扩展名,默认见代码中的构造方法
注:extMap中的key中必须含有dirName
------------------------------------------------------------------------
实现代码:
package com.ln.ydc.blog.util; import java.io.File; import java.io.IOException; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Arrays; import java.util.Date; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Random; import javax.servlet.http.HttpServletRequest; 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; /** * 文件上传工具类 * * @author yangdc * @date Apr 18, 2012 * * <pre> * </pre> */ public class UploadUtils { /** * 表单字段常量 */ public static final String FORM_FIELDS = "form_fields"; /** * 文件域常量 */ public static final String FILE_FIELDS = "file_fields"; // 最大文件大小 private long maxSize = 1000000; // 定义允许上传的文件扩展名 private Map<String, String> extMap = new HashMap<String, String>(); // 文件保存目录相对路径 private String basePath = "upload"; // 文件的目录名 private String dirName = "images"; // 上传临时路径 private static final String TEMP_PATH = "/temp"; private String tempPath = basePath + TEMP_PATH; // 若不指定则文件名默认为 yyyyMMddHHmmss_xyz private String fileName; // 文件保存目录路径 private String savePath; // 文件保存目录url private String saveUrl; // 文件最终的url包括文件名 private String fileUrl; public UploadUtils() { // 其中images,flashs,medias,files,对应文件夹名称,对应dirName // key文件夹名称 // value该文件夹内可以上传文件的后缀名 extMap.put("images", "gif,jpg,jpeg,png,bmp"); extMap.put("flashs", "swf,flv"); extMap.put("medias", "swf,flv,mp3,wav,wma,wmv,mid,avi,mpg,asf,rm,rmvb"); extMap.put("files", "doc,docx,xls,xlsx,ppt,htm,html,txt,zip,rar,gz,bz2"); } /** * 文件上传 * * @param request * @return infos info[0] 验证文件域返回错误信息 info[1] 上传文件错误信息 info[2] savePath info[3] saveUrl info[4] fileUrl */ @SuppressWarnings("unchecked") public String[] uploadFile(HttpServletRequest request) { String[] infos = new String[5]; // 验证 infos[0] = this.validateFields(request); // 初始化表单元素 Map<String, Object> fieldsMap = new HashMap<String, Object>(); if (infos[0].equals("true")) { fieldsMap = this.initFields(request); } // 上传 List<FileItem> fiList = (List<FileItem>) fieldsMap.get(UploadUtils.FILE_FIELDS); if (fiList != null) { for (FileItem item : fiList) { infos[1] = this.saveFile(item); } infos[2] = savePath; infos[3] = saveUrl; infos[4] = fileUrl; } return infos; } /** * 上传验证,并初始化文件目录 * * @param request */ private String validateFields(HttpServletRequest request) { String errorInfo = "true"; // boolean errorFlag = true; // 获取内容类型 String contentType = request.getContentType(); int contentLength = request.getContentLength(); // 文件保存目录路径 savePath = request.getSession().getServletContext().getRealPath("/") + basePath + "/"; // 文件保存目录URL saveUrl = request.getContextPath() + "/" + basePath + "/"; File uploadDir = new File(savePath); if (contentType == null || !contentType.startsWith("multipart")) { // TODO System.out.println("请求不包含multipart/form-data流"); errorInfo = "请求不包含multipart/form-data流"; } else if (maxSize < contentLength) { // TODO System.out.println("上传文件大小超出文件最大大小"); errorInfo = "上传文件大小超出文件最大大小[" + maxSize + "]"; } else if (!ServletFileUpload.isMultipartContent(request)) { // TODO errorInfo = "请选择文件"; } else if (!uploadDir.isDirectory()) {// 检查目录 // TODO errorInfo = "上传目录[" + savePath + "]不存在"; } else if (!uploadDir.canWrite()) { // TODO errorInfo = "上传目录[" + savePath + "]没有写权限"; } else if (!extMap.containsKey(dirName)) { // TODO errorInfo = "目录名不正确"; } else { // .../basePath/dirName/ // 创建文件夹 savePath += dirName + "/"; saveUrl += dirName + "/"; File saveDirFile = new File(savePath); if (!saveDirFile.exists()) { saveDirFile.mkdirs(); } // .../basePath/dirName/yyyyMMdd/ SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd"); String ymd = sdf.format(new Date()); savePath += ymd + "/"; saveUrl += ymd + "/"; File dirFile = new File(savePath); if (!dirFile.exists()) { dirFile.mkdirs(); } // 获取上传临时路径 tempPath = request.getSession().getServletContext().getRealPath("/") + tempPath + "/"; File file = new File(tempPath); if (!file.exists()) { file.mkdirs(); } } return errorInfo; } /** * 处理上传内容 * * @param request * @param maxSize * @return */ @SuppressWarnings("unchecked") private Map<String, Object> initFields(HttpServletRequest request) { // 存储表单字段和非表单字段 Map<String, Object> map = new HashMap<String, Object>(); // 第一步:判断request boolean isMultipart = ServletFileUpload.isMultipartContent(request); // 第二步:解析request if (isMultipart) { // Create a factory for disk-based file items DiskFileItemFactory factory = new DiskFileItemFactory(); // 阀值,超过这个值才会写到临时目录,否则在内存中 factory.setSizeThreshold(1024 * 1024 * 10); factory.setRepository(new File(tempPath)); // Create a new file upload handler ServletFileUpload upload = new ServletFileUpload(factory); upload.setHeaderEncoding("UTF-8"); // 最大上传限制 upload.setSizeMax(maxSize); /* FileItem */ List<FileItem> items = null; // Parse the request try { items = upload.parseRequest(request); } catch (FileUploadException e) { // TODO Auto-generated catch block e.printStackTrace(); } // 第3步:处理uploaded items if (items != null && items.size() > 0) { Iterator<FileItem> iter = items.iterator(); // 文件域对象 List<FileItem> list = new ArrayList<FileItem>(); // 表单字段 Map<String, String> fields = new HashMap<String, String>(); while (iter.hasNext()) { FileItem item = iter.next(); // 处理所有表单元素和文件域表单元素 if (item.isFormField()) { // 表单元素 String name = item.getFieldName(); String value = item.getString(); fields.put(name, value); } else { // 文件域表单元素 list.add(item); } } map.put(FORM_FIELDS, fields); map.put(FILE_FIELDS, list); } } return map; } /** * 保存文件 * * @param obj * 要上传的文件域 * @param file * @return */ private String saveFile(FileItem item) { String error = "true"; String fileName = item.getName(); String fileExt = fileName.substring(fileName.lastIndexOf(".") + 1).toLowerCase(); if (item.getSize() > maxSize) { // 检查文件大小 // TODO error = "上传文件大小超过限制"; } else if (!Arrays.<String> asList(extMap.get(dirName).split(",")).contains(fileExt)) {// 检查扩展名 error = "上传文件扩展名是不允许的扩展名。\n只允许" + extMap.get(dirName) + "格式。"; } else { String newFileName; if ("".equals(fileName.trim())) { SimpleDateFormat df = new SimpleDateFormat("yyyyMMddHHmmss"); newFileName = df.format(new Date()) + "_" + new Random().nextInt(1000) + "." + fileExt; } else { newFileName = fileName + "." + fileExt; } // .../basePath/dirName/yyyyMMdd/yyyyMMddHHmmss_xxx.xxx fileUrl = saveUrl + newFileName; try { File uploadedFile = new File(savePath, newFileName); item.write(uploadedFile); /* * FileOutputStream fos = new FileOutputStream(uploadFile); // 文件全在内存中 if (item.isInMemory()) { fos.write(item.get()); } else { InputStream is = item.getInputStream(); byte[] buffer = * new byte[1024]; int len; while ((len = is.read(buffer)) > 0) { fos.write(buffer, 0, len); } is.close(); } fos.close(); item.delete(); */ } catch (IOException e) { e.printStackTrace(); System.out.println("上传失败了!!!"); } catch (Exception e) { e.printStackTrace(); } } return error; } /** **********************get/set方法********************************* */ public String getSavePath() { return savePath; } public String getSaveUrl() { return saveUrl; } public long getMaxSize() { return maxSize; } public void setMaxSize(long maxSize) { this.maxSize = maxSize; } public Map<String, String> getExtMap() { return extMap; } public void setExtMap(Map<String, String> extMap) { this.extMap = extMap; } public String getBasePath() { return basePath; } public void setBasePath(String basePath) { this.basePath = basePath; tempPath = basePath + TEMP_PATH; } public String getDirName() { return dirName; } public void setDirName(String dirName) { this.dirName = dirName; } public String getTempPath() { return tempPath; } public void setTempPath(String tempPath) { this.tempPath = tempPath; } public String getFileUrl() { return fileUrl; } public String getFileName() { return fileName; } public void setFileName(String fileName) { this.fileName = fileName; } }
相关推荐
本文将深入探讨如何使用Java和Spring实现文件上传,以及相关的类和接口。 首先,我们需要了解`MultipartFile`接口。它是Spring MVC中用于处理多部分HTTP请求(即文件上传)的核心接口。通过这个接口,我们可以读取...
MinIO通用上传工具类
可配置性:允许灵活配置NFS服务器地址、挂载点以及其他相关参数,使工具类具备良好的通用性和适应性。 易用性:开发者可以直接调用统一的接口函数,无须深入了解NFS客户端编程的具体技术,显著降低开发难度和维护...
2、采用链式调用模式,只需要简单的配置当前运行采用哪个厂商,即可灵活的传输文件到对应云文件服务器中 3、支持OSS、COS、OBS、Minio等,如果是单机应用直接配置成本地即可 4、适用于对文件依赖比较大的应用
java操作minio文件服务的通用工具类,可以实现使用指定方法就能控制文件的上传下载删除以及更多操作
根据官网和网上分享的代码自己整理了一个阿里云OSS工具类,自动创建标准公开权限的存储空间,支持上传图片,音频,视频,PDF各种文件,批量上传,上传后支持在线预览,文件路径处理,浏览器文件下载(支持源文件中文...
3. **FileUploadUtil**: 文件上传工具类,常用于处理HTTP请求中的文件上传操作。它可能包含解析请求、验证文件大小、类型,以及将文件保存到服务器磁盘的功能。 4. **FTP传输方式**: FTP(文件传输协议)支持两种...
本篇文章将详细探讨如何使用Java实现FTP文件上传,以及相关类的作用。 首先,我们来看标题和描述中的关键词"java实现的ftp文件上传",这表明我们要讨论的是使用Java编程语言来实现在FTP服务器上上传文件的过程。...
本资料“Java-Android工具类”显然是一份包含了多种实用工具类的集合,旨在帮助开发者在Java和Android开发过程中节省时间和精力。 首先,我们来探讨一下SD工具类。在Android系统中,外部存储空间(如SD卡)通常用于...
本资源提供的"java实现部分工具类"涵盖了几个关键方面,包括前端Bootstrap样式的应用、页面布局管理、数据列表的渲染与展示以及分页和文件上传功能的实现。以下将对这些知识点进行详细阐述。 1. **Bootstrap样式与...
本jar 支持文件上传和 下载 , 有好多工具类, 欢迎大家
这个工具类可能包含用于连接FTP服务器、设置用户认证、上传文件、断点续传等方法,便于在应用程序中集成文件的远程传输功能。 3. **JSON格式化**: JSON(JavaScript Object Notation)是一种轻量级的数据交换格式...
2. **Apache Commons IO**: 这是另一个非常重要的库,提供了一系列通用的IO操作工具类,如文件复制、移动、读写、以及各种文件属性的获取。在文件下载时,`Commons IO`可以帮助我们构建高效的流处理逻辑,确保数据的...
总的来说,"java文件上传的用到的jar包"是一个包含各种文件上传解决方案的集合,涵盖了从基本的Servlet API到强大的第三方库,为Java开发者提供了丰富的工具来处理文件上传的需求。正确理解和使用这些库,可以使你的...
在Java中,工具类(Util Classes)是为了提供通用功能而设计的,可以大大提高开发效率。针对标题和描述中提到的"java工具类 ftp 文件比较 socket http",我们将探讨Java中的FTP文件传输、文件比较、Socket通信以及...
7. **FileUpLoadUtils.java**:文件上传工具类。文件上传是Web应用中常见的用户交互,FileUpLoadUtils提供了处理文件上传的功能,如校验文件大小、类型,将文件保存到服务器指定位置,以及可能的文件类型转换等。 ...
"28个java常用的工具类"这个压缩包很可能包含了一系列这样的工具类,用于字符串操作、日期转换以及文件上传下载等场景。接下来,我们将深入探讨这些关键知识点。 首先,让我们关注一下“字符串操作”。在Java中,`...
获取路径通用方法,上传图片通用方法,上传文件并创建目录方法
在Java编程语言中,工具类(Utility Class)是封装了常用功能的一类静态方法集合,它们为开发者提供了方便快捷的接口,以简化代码编写。这个压缩包“Java常用工具类”很可能包含了一些由一位有着五年开发经验的...
本资源提供了一个基于Java实现的Excel导入导出工具类,结合注解的使用,使得这一功能更加便捷和通用。这个工具适用于构建公共的Excel处理模块,能够有效地提高开发效率。 首先,我们来看一下导入导出的基本原理。在...