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. Java排序算法之堆排序

    堆的概念: 堆是一种完全二叉树,非叶子结点 i 要满足key[i]>key[i+1]&&key[i]>key[i+2](最大堆) 或者 key[i]<key[i+1] ...

  2. 抽象工厂模式(Abstract Factory)

    (二)抽象工厂模式(Abstract Factory) 1.抽象工厂模式(Abstract Factory),提供了一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类. 2.抽象工厂模式是 ...

  3. Java常用的八种排序算法与代码实现

    1.直接插入排序 经常碰到这样一类排序问题:把新的数据插入到已经排好的数据列中. 将第一个数和第二个数排序,然后构成一个有序序列 将第三个数插入进去,构成一个新的有序序列. 对第四个数.第五个数--直 ...

  4. 关于解决配置Tomact过程中出现的相关问题

    最近在学习JavaWeb, 但是在第一步的时候就出现问题了, 什么问题呢, 就是关于Tomact的配置. 下面我就详细说明一下我配置过程中出现的问题以及怎么解决的,  希望对大家能有所帮助. 首先,我 ...

  5. Java: 隐性赋值(Implicit Assignment)

    初学 Java 时,我总是记不住如何区别 i++ 和 ++i.在<算法(第四版)>一书中第16页,作者提到: ** ++i ** is the same as i = i+1, and h ...

  6. 前端魔法堂:解秘FOUC

    前言  对于问题多多的IE678,FOUC(flash of unstyled content)--浏览器样式闪烁是一个不可忽视的话题,但对于ever green的浏览器就不用理会了吗?下面尝试较全面 ...

  7. Unity Debug类

    静态变量 developerConsoleVisible 报告是否开发控制台是可见的.开发控制台不能出现使用: isDebugBuild 在构建设置对话框中有一个叫做"发展构建"复 ...

  8. 用vuejs仿网易云音乐(实现听歌以及搜索功能)

    前言 前端时间学了vue,一开始看了vue1.0,后来实在觉得技术总得实践,就直接上手vue2.0.然后花了将近一周时间做了一个网易云音乐的小项目.一开始觉得项目比较小,没必要用vuex所以就没有使用 ...

  9. 没有理由,就是要上一波C++的东西

    从入门开始,一直在用C , 对于C++可谓是一窍不通,只能是勉强看懂C++的代码,至于写更是连头文件什么iostream是什么我都不知道,更不用说什么using namespace std :之类的东 ...

  10. 用 Python 编写网络爬虫 笔记

    Chapter I 简介 为什么要写爬虫? 每个网站都应该提供 API,然而这是不可能的 即使提供了 API,往往也会限速,不如自己找接口 注意已知条件(robots.txt 和 sitemap.xm ...