一、文件上传

public UploadResult upload(MultipartFile file) {Assert.notNull(file, "Multipart file must not be null");// Get current time  获取当前时间Calendar current = Calendar.getInstance(optionService.getLocale());// Get month and day of month  获取当前年和月int year = current.get(Calendar.YEAR);int month = current.get(Calendar.MONTH) + 1;String monthString = month < 10 ? "0" + month : String.valueOf(month);// Build directory   构建上传文件存储目录String subDir = UPLOAD_SUB_DIR + year + FILE_SEPARATOR + monthString + FILE_SEPARATOR;//获取上传文件名String originalBasename = FilenameUtils.getBasename(Objects.requireNonNull(file.getOriginalFilename()));// Get basename  构建文件名String basename = originalBasename + '-' + HaloUtils.randomUUIDWithoutDash();// Get extension  构建文件类型String extension = FilenameUtils.getExtension(file.getOriginalFilename());log.debug("Base name: [{}], extension: [{}] of original filename: [{}]", basename, extension, file.getOriginalFilename());// Build sub file path  构建子文件路径String subFilePath = subDir + basename + '.' + extension;// Get upload path  构建上传文件存储目录路径Path uploadPath = Paths.get(workDir, subFilePath);log.info("Uploading file: [{}]to directory: [{}]", file.getOriginalFilename(), uploadPath.toString());try {// TODO Synchronize here// Create directory   创建目录,创建文件Files.createDirectories(uploadPath.getParent());Files.createFile(uploadPath);   // Upload this file   上传文件file.transferTo(uploadPath);// Build upload result   构建上传结果UploadResult uploadResult = new UploadResult();uploadResult.setFilename(originalBasename);uploadResult.setFilePath(subFilePath);uploadResult.setKey(subFilePath);uploadResult.setSuffix(extension);uploadResult.setMediaType(MediaType.valueOf(Objects.requireNonNull(file.getContentType())));uploadResult.setSize(file.getSize());// TODO refactor this: if image is svg ext. extensionboolean isSvg = "svg".equals(extension);// Check file type  检查文件类型if (FileHandler.isImageType(uploadResult.getMediaType()) && !isSvg) {lock.lock();try (InputStream uploadFileInputStream = new FileInputStream(uploadPath.toFile())) {// Upload a thumbnail   上传压缩图String thumbnailBasename = basename + THUMBNAIL_SUFFIX;String thumbnailSubFilePath = subDir + thumbnailBasename + '.' + extension;Path thumbnailPath = Paths.get(workDir + thumbnailSubFilePath);// Read as image   解读为图像BufferedImage originalImage = ImageUtils.getImageFromFile(uploadFileInputStream, extension);// Set width and heightuploadResult.setWidth(originalImage.getWidth());uploadResult.setHeight(originalImage.getHeight());// Generate thumbnail    生成缩略图boolean result = generateThumbnail(originalImage, thumbnailPath, extension);if (result) {// Set thumb path   设置缩略图路径uploadResult.setThumbPath(thumbnailSubFilePath);} else {// If generate erroruploadResult.setThumbPath(subFilePath);}} finally {lock.unlock();}} else {uploadResult.setThumbPath(subFilePath);}log.info("Uploaded file: [{}] to directory: [{}] successfully", file.getOriginalFilename(), uploadPath.toString());return uploadResult;} catch (IOException e) {throw new FileOperationException("上传附件失败").setErrorData(uploadPath);}}
//获取文件名  例如: houtai2.jpg  -->   houtai2
@NonNull
public static String getBasename(@NonNull String filename) {Assert.hasText(filename, "Filename must not be blank");// Find the last slashint separatorLastIndex = StringUtils.lastIndexOf(filename, File.separatorChar);if (separatorLastIndex == filename.length() - 1) {return StringUtils.EMPTY;}if (separatorLastIndex >= 0 && separatorLastIndex < filename.length() - 1) {filename = filename.substring(separatorLastIndex + 1);}// Find last dotint dotLastIndex = StringUtils.lastIndexOf(filename, '.');if (dotLastIndex < 0) {return filename;}return filename.substring(0, dotLastIndex);}
@NonNull    //  构建文件的类型  例如: houtai2.jpg  -- > jpg
public static String getExtension(@NonNull String filename) {Assert.hasText(filename, "Filename must not be blank");// Find the last slashint separatorLastIndex = StringUtils.lastIndexOf(filename, File.separatorChar);if (separatorLastIndex == filename.length() - 1) {return StringUtils.EMPTY;}if (separatorLastIndex >= 0 && separatorLastIndex < filename.length() - 1) {filename = filename.substring(separatorLastIndex + 1);}// Find last dotint dotLastIndex = StringUtils.lastIndexOf(filename, '.');if (dotLastIndex < 0) {return StringUtils.EMPTY;}return filename.substring(dotLastIndex + 1);}
//返回图像数据缓存区
public static BufferedImage getImageFromFile(InputStream is, String extension) throws IOException {log.debug("Current File type is : [{}]", extension);if (EXTENSION_ICO.equals(extension)) {return ICODecoder.read(is).get(0);} else {return ImageIO.read(is);}}

文件上传(upload)相关推荐

  1. Play框架文件上传Upload、FileUpload类使用详解

    最近做一个前后台分离的项目,要用到前端页面传递文件对象给后端,就研究了一下框架中自带的类Upload接口.FileUpload类. 1. 后端的控制器能够接收到play.mvc.Http.Reques ...

  2. (白帽子学习笔记)前渗透——文件上传upload labs

    读者需知 1.本文仅供学习使用,由于传播和利用此文所造成的损失均由使用者本人负责,文章作者不为此承担责任 2.本文参考了一些文章,如有侵权请联系本人删除 第一关--前端验证 1.将浏览器中的JS代码禁 ...

  3. 文件上传upload.render小记

    upload.render失效 遇到的问题: 正确代码如下: 分析错误代码: 遇到的问题: 初始化时能正常打开上传,但点击查询后上传按钮失效 正确代码如下: if(paramPage>0){va ...

  4. java ajax多文件上传插件_jQuery Upload File 多文件批量上传插件 - 资源

    jQuery File UPload 包含多个带有进度条的文件上传,能够兼容任意的服务端语言,例如 PHP.Python.Ruby on Rails.Java等,支持标准的HTML表单文件上传.jQu ...

  5. Struts2 单个文件上传/多文件上传

    1导入struts2-blank.war所有jar包:\struts-2.3.4\apps\struts2-blank.war 单个文件上传 upload.jsp <s:form action= ...

  6. 文件上传之Springmvc方式上传代码

    <%@ page contentType="text/html;charset=UTF-8" language="java" %> <html ...

  7. layui上传文件请求接口异常_SpringMVC实现文件上传与下载,拦截器,异常处理

    第一章:响应数据和结果视图 1. 返回字符串 Controller方法返回字符串可以指定逻辑视图的名称,根据视图解析器为物理视图的地址. @RequestMapping(value="/he ...

  8. SpringMVC实现文件上传

    1.文件上传之上传原理分析和搭建环境 springmvc文件上传也会用到Javaweb实现文件上传的组件. 1.1文件上传的必要条件 A .form 表单的 enctype 取值必须是:multipa ...

  9. Spring mvc 文件上传

    1.文件上传的必要前提 A.form 表单的 enctype 取值必须是:multipart/form-data (默认值是:application/x-www-form-urlencoded) en ...

  10. SSM框架之Spring MVC(三)http响应、文件上传

    一.响应数据和结果视图 1.1 返回值分类 1.1.1 字符串 创建实体类和controller类 实体类User package cn.xiaomifeng1010.domain;import ja ...

最新文章

  1. centos系统为php安装memcached扩展步骤
  2. StackOverflow 上面最流行的 7 个 Java 问题!
  3. QT-X11-3.1.2.tar.bz2的使用
  4. JZOJ 5603. 【NOI2018模拟3.27】Xjz
  5. linux系统下springboot jar方式启动后允许后台运行
  6. LiveVideoStack 主编观察 01
  7. Linux 设备驱动模型中的class(类)
  8. 高数复习9.13 函数与极限
  9. c primer英文版第5版_2019足坛10大巨星:梅西第2范戴克第3,C罗第5
  10. 数据的冗余和数据的完整性 1006
  11. 南京信息工程大学百科园c语言答案,南京信息工程大学822C/C++程序设计考研真题及笔记...
  12. 【绘图】matlab绘制图形
  13. json解析 spark_PySpark算子处理空间数据全解析(8):构造空间数据的RDD(2)
  14. 手工安装hr表+oracle,[20200825]手工安装HR schema.txt
  15. 钉钉机器人:python发送消息-加签模式
  16. Linux进程管理---task_struct
  17. 江西科技师范大学泰豪校区计算机专业,扎心了!比取经还艰难的大学路,南昌居然占了这么多……...
  18. Mixly Aduino 超声波~蜂鸣器
  19. Vite入门从手写一个乞丐版的Vite开始(下)
  20. C# 如何生成CHM帮助文件

热门文章

  1. 浅谈一类积性函数的前缀和(转载)
  2. 低成本高效能!Kilopass公布VLT存储技术
  3. linux 显示系统空间不足,Linux系统boot空间不足解决办法
  4. 山东之所以落后的简要分析
  5. Termux高级终端安装使用配置教程
  6. VMware, RedHat, VirtualBOX, Ubuntu以及Fedora的安装和配置
  7. Logstash:使用 aggregation filter 把事件流聚合为一个事件
  8. VVC DRAP帧和EDRAP帧,STSA picture
  9. 【TG-02系列模组①】二次开发环境搭建,快速接入天猫精灵/亚马逊云
  10. 如何才能画好人物的脸部?人物五官怎样画?