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. 上传图片转为base64格式预览并压缩图片(不兼容IE9以下浏览器,兼容移动端ios,android)

    前些天公司要求在微信移动端做上传图片并预览的功能,要求能够调用摄像头拍照并立即预览. 在网上搜了一些方法,开始自己写了个简单的功能实现代码.结果发现移动端拍照出来的图片动不动就2M+,又因为要批量上传 ...

  2. asp.net core源码飘香:Options组件

    简介: Options组件是一个小组件,但用的地方很多.它本质是将一个POCO类注册到容器中(主要在Startup中作为其他组件的配置功能提供),后续使用的时候就可以通过比如构造函数注入等获取到POC ...

  3. C#---------------继承和多态初步

    继承:在程序中,如果一个类A:类B,这种机制就是继承. 子类可以继承父类的所有内容(成员)吗? 解析: 1.私有成员(属性和方法) 2.构造函数 3.final修饰过的方法,子类不能进行重写 3.访问 ...

  4. Centos7多网卡绑定操作,通过nmcli命令操作。

    运行 ip link 命令查看系统中可用的接口1.创建bond网卡nmcli con add type team con-name team0 ifname team0 config '{" ...

  5. Python3.5爬虫统计AcFun所有视频,并按各个类别进行Top100排序展示

    前(b)言(b): 前段时间对Python产生了浓厚的兴趣,所以决定入门学习了1个多月,后来某时我需要对tomcat做一个压力测试,于是我想到了用Python写一个压力测试的脚本吧!最后捣鼓出了一个脚 ...

  6. ios 毛玻璃效果

    推荐第三方库: https://github.com/nicklockwood/FXBlurView FXBlurView*Fx=[[FXBlurView alloc]initWithFrame:CG ...

  7. yii2.0套用模板问题

    载入视图 在控制器中: $this->render(); 会加载布局 $this->renderPartial(); 不会加载布局(也不能载入框架自带的jquery等) Yii2 选择布局 ...

  8. JavaWeb开发之Servlet

    1. Servlet有关概念和前置知识 1.1 什么是动态网页 如果浏览器在不同时刻或不同条件下访问web服务器上的某个页面,浏览器所获得的页面内容可以发生变化,那么这个页面就称之为动态页面. 动态网 ...

  9. linux C/C++ 日志打印函数

    //宏定义日志文件名 #define PROCESSNAME  "log_filename" //当日志文件大于5M时,会删除该文件,该接口使用方法 参照printfvoid Wr ...

  10. STM8驱动HX711

    普及:HX711AD一款专为高精度电子秤而设计的 24 位 A/D 转换器芯片:                 获取数据方法:两个普通IO      DOUT输入:GPIO_Mode_In_FL_N ...