package com.clou.inteface.domain.web.user;

 import java.io.File;
 import java.io.IOException;
 import java.util.HashMap;
 import java.util.Map;

 import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Value;
 import org.springframework.http.MediaType;
 import org.springframework.web.bind.annotation.PostMapping;
 import org.springframework.web.bind.annotation.RequestParam;
 import org.springframework.web.bind.annotation.RestController;
 import org.springframework.web.multipart.MultipartFile;

 /**
  * 文件上传
  * @author Fly
  *
  */
 @RestController
 public class FileUpload {

     /**
      * 用户管理 -> 业务层
      */
     @Autowired
     private SUserService sUserService;

     /**
      * 文件上传根目录(在Spring的application.yml的配置文件中配置):<br>
      * web:
      *         upload-path: (jar包所在目录)/resources/static/
      */
     @Value("${web.upload-path}")
     private String webUploadPath;

     /**
      * ResultVo是一个对象,包含:
      * private int errorCode;
      * private String errorMsg;
      * private Integer total;
      * private Object data;
      */

     /**
      * 基于用户标识的头像上传
      * @param file 图片
      * @param userId 用户标识
      * @return
      */
     @PostMapping(value = "/fileUpload", consumes = MediaType.MULTIPART_FORM_DATA_VALUE, produces = MediaType.APPLICATION_JSON_VALUE)
     public ResultVo fileUpload(@RequestParam("file") MultipartFile file, @RequestParam("userId") Integer userId) {
         ResultVo resultVo = new ResultVo();
         if (!file.isEmpty()) {
             if (file.getContentType().contains("image")) {
                 try {
                     String temp = "images" + File.separator + "upload" + File.separator;
                     // 获取图片的文件名
                     String fileName = file.getOriginalFilename();
                     // 获取图片的扩展名
                     String extensionName = StringUtils.substringAfter(fileName, ".");
                     // 新的图片文件名 = 获取时间戳+"."图片扩展名
                     String newFileName = String.valueOf(System.currentTimeMillis()) + "." + extensionName;
                     // 数据库保存的目录
                     String datdDirectory = temp.concat(String.valueOf(userId)).concat(File.separator);
                     // 文件路径
                     String filePath = webUploadPath.concat(datdDirectory);

                     File dest = new File(filePath, newFileName);
                     if (!dest.getParentFile().exists()) {
                         dest.getParentFile().mkdirs();
                     }
                     // 判断是否有旧头像,如果有就先删除旧头像,再上传
                     SUser userInfo = sUserService.findUserInfo(userId.toString());
                     if (StringUtils.isNotBlank(userInfo.getUserHead())) {
                         String oldFilePath = webUploadPath.concat(userInfo.getUserHead());
                         File oldFile = new File(oldFilePath);
                         if (oldFile.exists()) {
                             oldFile.delete();
                         }
                     }
                     // 上传到指定目录
                     file.transferTo(dest);

                     // 将图片流转换进行BASE64加码
                     //BASE64Encoder encoder = new BASE64Encoder();
                     //String data = encoder.encode(file.getBytes());

                     // 将反斜杠转换为正斜杠
                     String data = datdDirectory.replaceAll("\\\\", "/") + newFileName;
                     Map<String, Object> resultMap = new HashMap<>();
                     resultMap.put("file", data);
                     resultVo.setData(resultMap);
                     resultVo.setError(1, "上传成功!");
                 } catch (IOException e) {
                     resultVo.setError(0, "上传失败!");
                 }
             } else {
                 resultVo.setError(0, "上传的文件不是图片类型,请重新上传!");
             }
             return resultVo;
         } else {
             resultVo.setError(0, "上传失败,请选择要上传的图片!");
             return resultVo;
         }
     }

 }

  以上代码需配置SUserService,一个业务层接口;

一个ResultVo对象,属性已给出;

一个基于Spring Boot的 .yml配置文件的配置。

访问图片的时候,需要配置.yml文件

spring:

  #配置http访问服务器图片的路径
  resources:
    static-locations: classpath:/META-INF/resources/,classpath:/resources/, classpath:/static/,classpath:/public/,file:${web.upload-path}

然后基于服务的IP与端口,http//IP:port/resources/static/图片路径(图片名)

基于Spring Boot的图片上传的更多相关文章

  1. Spring Boot +Bootstrap 图片上传与下载,以及在bootstrap-table中的显示

    1.前台上传: <input type="file" name="file" id="file"> 2.后台的接收与处理: St ...

  2. spring boot:单文件上传/多文件上传/表单中多个文件域上传(spring boot 2.3.2)

    一,表单中有多个文件域时如何实现说明和文件的对应? 1,说明和文件对应 文件上传页面中,如果有多个文件域又有多个相对应的文件说明时, 文件和说明如何对应? 我们在表单中给对应的file变量和text变 ...

  3. Spring Boot入门——文件上传与下载

    1.在pom.xml文件中添加依赖 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="ht ...

  4. 基于html5的多图片上传,预览

    基于html5的多图片上传 本文是建立在张鑫旭大神的多文图片传的基础之上. 首先先放出来大神多图片上传的博客地址:http://www.zhangxinxu.com/wordpress/2011/09 ...

  5. Spring Boot 在接收上传文件时,文件过大异常处理问题

    Spring Boot 在接收上传文件时,文件过大时,或者请求过大,spring内部处理都会抛出异常,并且捕获不到. 虽然可以通过调节配置,增大 请求的限制值. 但是还是不太方便. 之所以捕获不到异常 ...

  6. 基于cropper.js的图片上传和裁剪

    项目中要求图片上传并裁剪的功能,之前也有接触过很多图片裁剪插件,效果体验不是很好,今天推荐一款好用的插件-cropper,超级好用,裁剪功能丰富,满足了各种需求. 功能: 1:点击选择图片,弹出文件夹 ...

  7. 基于Node的React图片上传组件实现

    写在前面 红旗不倒,誓把JavaScript进行到底!今天介绍我的开源项目 Royal 里的图片上传组件的前后端实现原理(React + Node),花了一些时间,希望对你有所帮助. 前端实现 遵循R ...

  8. 基于.NET Core2的图片上传

    其实,.NET Core2的图片上传挺好做的,只是,有些坑要注意.......话不多说,上代码 public async Task<IActionResult> Upload([FromS ...

  9. Spring Boot 教程 - 文件上传下载

    在日常的开发工作中,基本上每个项目都会有各种文件的上传和下载,大多数文件都是excel文件,操作excel的JavaAPI我用的是apache的POI进行操作的,POI我之后会专门讲到.此次我们不讲如 ...

随机推荐

  1. 数据库习题(oracle)

    学生表 Student 字段值分别是 Sid ,Sname ,Sage ,Ssex 教师表 Teacher 字段值分别是 Tid ,Tname 课程表 Course 字段值分别是Cid ,Cname ...

  2. boostrap详情解毒

    详解Bootstrap表单组件 表单常见的元素主要包括:文本输入框.下拉选择框.单选框.复选框.文本域.按钮等.下面是不同的bootstrap版本: LESS:  forms.less SASS:  ...

  3. vertical-align 与 line-height 傻傻分不清??

    要说吧,咱家是个菜鸟,以前遇见垂直居中的东东,也是现查现用,其中最长遇到的东西就是 vertical-align 和 line-height,似乎这俩个兄弟都可以实现居中对齐,不过窃以为二者还是有区别 ...

  4. Java虚拟机创建对象的内存分配以及对象的内存布局

    本博文知识参考周志明<深入理解Java虚拟机> Java虚拟机在创建对象使如果进行内存分配: 1.指针碰撞 2.空闲列表 Java在多线程情况下创建对象的内存分配: Java完成对象内存分 ...

  5. 事件驱动的简明讲解(python实现)

    关键词:编程范式,事件驱动,回调函数,观察者模式 作者:码匠信龙 举个简单的例子: 有些人喜欢的某个公众号,然后去关注这个公众号,哪天这个公众号发布了篇新的文章,没多久订阅者就会在微信里收到这个公众号 ...

  6. CentOS6.5 配置本地Yum源

    一.Yum简介 1.Yum(全称为 Yellow dog Updater, Modified)是一个在Fedora和RedHat以及CentOS中的Shell前端软件包管理器. 2.基于RPM包管理, ...

  7. Hibernate学习--hibernate延迟加载原理(动态代理)

    在正式说hibernate延迟加载时,先说说一个比较奇怪的现象吧:hibernate中,在many-to-one时,如果我们设置了延迟加载,会发现我们在eclipse的调试框中查看one对应对象时,它 ...

  8. Java集合之Map和Set

    以前就知道Set和Map是java中的两种集合,Set代表集合元素无序.不可重复的集合:Map是代表一种由多个key-value对组成的集合.然后两个集合分别有增删改查的方法.然后就迷迷糊糊地用着.突 ...

  9. IDEA第三章----idea常用配置

    前两章讲解了idea的git.maven.jdk.tomcat.编码等基本配置,可以让你的项目正常运行,这一章将讲解idea的一些常用设置,这些也正是idea可爱之处,大大提高了开发的效率. 第一节: ...

  10. C++STL vector详解(杂谈)

    介绍 这篇文章的目的是为了介绍std::vector,如何恰当地使用它们的成员函数等操作.本文中还讨论了条件函数和函数指针在迭代算法中使用,如在remove_if()和for_each()中的使用.通 ...