一、前言


1、用户文件存储在项目中,项目体积会日益增大,给日后项目代码更新、部署上传时间增长。
此外 linux、windows 的路径不一致,保存文件的路径只能使用相对路径,前端展示文件时 src 需要 + http://port/xxx 补全路径,增加了点业务逻辑。

等等。

2、OSS云存储技术优点:

1.OSS 内存省钱
2.可以使用了第三方cdn,访问速度快

3、使用了阿里云OSS技术其他优点:

1.浏览器访问图片(png、jpg…)url,显示图片;
2.浏览器访问文件(doc、pdf…)url,自动下载文件;

二、思路

1、前台上传图片给后台

2、后台把图片上传到阿里云服务器的OSS中

3、同时生成图片访问的 url,保存到数据库中

4、显示图片的时候,使用 url,如下的使用方式

<img src="url" />

二、代码

2017.7.14 更新,代码已经放在 github 上了:https://github.com/larger5/oss_aliyun_springboot.git

1、代码目录

2、entity 实体

package com.cun.entity;import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.Table;@Entity
@Table(name="t_picture")
public class Picture {@Id@GeneratedValueprivate Integer id;@Column(length=50)private String picName;@Column(length=200)private String url;public Integer getId() {return id;}public void setId(Integer id) {this.id = id;}public String getPicName() {return picName;}public void setPicName(String picName) {this.picName = picName;}public String getUrl() {return url;}public void setUrl(String url) {this.url = url;}}

2、dao 接口

package com.cun.dao;import org.springframework.data.jpa.repository.JpaRepository;import com.cun.entity.Picture;public interface PictureDao extends JpaRepository<Picture, Integer>{}

3、Service 接口

package com.cun.service;import java.util.List;import com.cun.entity.Picture;public interface PictureService {/*** 删* @param id*/void deletePicture(Integer id);/*** 改* @param picture*/void updatePicture(Picture picture);/*** 查* @param id* @return*/Picture getPicture(Integer id);/*** 增* @param picture*/void insertPicture(Picture picture);/*** 全* @return*/List<Picture> getAllPictures();}

4、Service 实现类

package com.cun.service.impl;import java.util.List;import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;import com.cun.dao.PictureDao;
import com.cun.entity.Picture;
import com.cun.service.PictureService;@Service
public class PictureServiceImpl implements PictureService{@Autowiredprivate PictureDao pictureDao;@Overridepublic void deletePicture(Integer id) {pictureDao.delete(id);}@Overridepublic void updatePicture(Picture picture) {pictureDao.save(picture);}@Overridepublic Picture getPicture(Integer id) {return pictureDao.getOne(id);}@Overridepublic void insertPicture(Picture picture) {pictureDao.save(picture);}@Overridepublic List<Picture> getAllPictures() {return pictureDao.findAll();}}

5、Controller 控制层

package com.cun.controller;import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.net.URL;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;import javax.servlet.http.HttpServletRequest;import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.multipart.MultipartFile;import com.aliyun.oss.ClientException;
import com.aliyun.oss.OSSClient;
import com.aliyun.oss.OSSException;
import com.cun.entity.Picture;
import com.cun.service.PictureService;@Controller
@RequestMapping("/picture")
public class PictureController {@Autowiredprivate PictureService pictureService;/*** 主页* @return*/@GetMapping("/")public String toIndex() {return "add";}/*** 全* @return*/@ResponseBody@GetMapping("/all")public List<Picture> getAllPictures() {return pictureService.getAllPictures();}/*** 增* @param picture* @throws IOException * @throws ClientException * @throws OSSException */@PostMapping("/insert")public String insertPicture(@RequestParam("fileupload") MultipartFile fileupload, String picName,HttpServletRequest request) throws OSSException, ClientException, IOException {Picture picture=new Picture();picture.setPicName(picName);picture.setUrl(getUrl(fileupload));//虽然传来的是文件,但是保存到数据库的是路径pictureService.insertPicture(picture);return "show";}/*** 改* @param picture*/@ResponseBody@PutMapping("/update")public void updatePicture(Picture picture) {pictureService.updatePicture(picture);}/*** 删* @param id*/@ResponseBody@DeleteMapping("/delete/{id}")public void deletePicture(@PathVariable("id") Integer id) {pictureService.deletePicture(id);}/*** 查* @param id* @return*/@ResponseBody@GetMapping("/get/{id}")public Picture getPicture(@PathVariable("id") Integer id) {return pictureService.getPicture(id);}/*** 把文件保存到阿里云OSS,返回路径保存到数据库* @param fileupload* @return* @throws OSSException* @throws ClientException* @throws IOException*/public String getUrl(MultipartFile fileupload) throws OSSException, ClientException, IOException {//填写自己的帐号信息String endpoint = "xxxx";String accessKeyId = "xxxxxx";String accessKeySecret = "xxxxxx";// 创建OSSClient实例OSSClient ossClient = new OSSClient(endpoint, accessKeyId, accessKeySecret);// 文件桶String bucketName = "itaem";// 文件名格式SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddhhmmss");// 该桶中的文件keyString dateString = sdf.format(new Date()) + ".jpg";// 20180322010634.jpg// 上传文件ossClient.putObject("itaem", dateString, new ByteArrayInputStream(fileupload.getBytes()));// 设置URL过期时间为100年,默认这里是int型,转换为long型即可Date expiration = new Date(new Date().getTime() + 3600l * 1000 * 24 * 365 * 100);// 生成URLURL url = ossClient.generatePresignedUrl(bucketName, dateString, expiration);return url.toString();}}

6、添加页 add.html

<!DOCTYPE html>
<html><head><meta charset="UTF-8"></meta><title>ITAEM</title><script type="text/jscript" src="../jquery-easyui-1.3.3/jquery.min.js"></script></head><body><!-- 图片上传 --><form action="http://localhost/picture/insert" method="post" enctype="multipart/form-data">name<input type="text" name="picName" id="picName"></input><br /><br /><input type="file" name="fileupload" id="fileupload"></input><br /><br /><input type="submit" value="上传" ></input></form></body>
</html>

7、展示页 show.html

<!DOCTYPE html>
<html><head><meta charset="UTF-8"></meta><title>ITAEM</title><!--必须使用高版本的才能提示$.ajax--><script type="text/javascript" src="../js/jquery-1.7.2.js"></script><script type="text/javascript">$.ajax({type: "Get",url: "http://localhost/picture/all",success:function(result){$('#pic').empty()show(result)}});function show(result){var lists=result/* 遍历,省略了 for 循环 */$.each(lists, function(index,img) {/*必须独立出来再放进入*/var img=$("<img></img>").attr("src",img.url)$('#pic').append("<hr />").append(img)});}</script></head><body><div id="pic"></div></body></html>

8、pom 阿里云sdk依赖

<dependency><groupId>com.aliyun.oss</groupId><artifactId>aliyun-sdk-oss</artifactId><version>2.8.2</version>
</dependency>

其他

三、其他

1、阿里云 OSS API 文档:https://help.aliyun.com/document_detail/32008.html?spm=a2c4g.11186623.6.669.kWoPky
2、操作记录 gif 图
3、发布到 Linux 上的时,若要打成 war 包,会发现第三方 jar (本位为 ali oss)没有导入,可以参考如下文章:
https://www.sojson.com/blog/253.html
4、确保图片名称唯一,使用 uuid 比较好,不要使用时间字符串,应对不了高并发
String id = UUID.randomUUID().toString();
5、参考文章:[教程]如何解决Java sdk设置URL签名过期时间很长不生效
#四、2018.8.2 更新
做项目经常要用到,于是将 OSS 上传文件,下载访问文件 url,封装成一个 utils

package com.cun.app.utils;import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.net.URL;
import java.text.SimpleDateFormat;
import java.util.Date;import org.springframework.web.multipart.MultipartFile;import com.aliyun.oss.ClientException;
import com.aliyun.oss.OSSClient;
import com.aliyun.oss.OSSException;/*** 把文件保存到阿里云OSS,返回文件访问路径* @author linhongcun**/
public class Oss {public static String getFileUrl(MultipartFile fileupload) throws OSSException, ClientException, IOException {// 获取文件后缀名String suffix =getSuffix(fileupload);// 填自己的帐号信息String endpoint = "oss-cn-shenzhen.aliyuncs.com";String accessKeyId = "LTAIATBxxxxxxxx4R";String accessKeySecret = "VuCGomJW0O5xxxxxxxxx9QKR";// 创建OSSClient实例OSSClient ossClient = new OSSClient(endpoint, accessKeyId, accessKeySecret);// 文件桶String bucketName = "itaem";// 文件名格式SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddhhmmss");// 该桶中的文件keyString dateString = sdf.format(new Date()) + "."+suffix; // 20180322010634.jpg// 上传文件ossClient.putObject("itaem", dateString, new ByteArrayInputStream(fileupload.getBytes()));// 设置URL过期时间为100年,默认这里是int型,转换为long型即可Date expiration = new Date(new Date().getTime() + 3600l * 1000 * 24 * 365 * 100);// 生成URLURL url = ossClient.generatePresignedUrl(bucketName, dateString, expiration);return url.toString();}// 获取文 MultipartFile 文件后缀名工具public static String getSuffix(MultipartFile fileupload){String originalFilename = fileupload.getOriginalFilename();String suffix = originalFilename.substring(originalFilename.lastIndexOf(".") + 1);System.out.println(suffix);return suffix;}}

在SpringBoot中使用【阿里云OSS对象存储】存取图片相关推荐

  1. 阿里云oss对象存储图片预处理

    点子 最近发现阿里云oss对象存储还有图片处理技术,只要图片链接附加一些参数信息,可以将处理之后的图片发送过来,相比起先发送再处理要有很多好处. 优点 不需要本地处理图片了 发送的图片是处理过的比如假 ...

  2. 阿里云OSS——对象存储服务(工具)

    阿里云OSS--对象存储服务(工具) 一.依赖 二.yaml配置 三.OSS工具类 四.demo演示 4.1 SpringBoot启动类 4.2 Controller接口 4.3 swagger测试 ...

  3. 阿里云OSS对象存储-图文详解

    阿里云OSS对象存储 认识OSS 一.创建Bucket 二.后台服务接口编写 三.接口测试 认识OSS 在实际的项目中,经常要用到上传图片的地方,阿里云的OSS对象存储,可以很好的将我们上传的图片存储 ...

  4. 【阿里云OSS对象存储搭配CDN加速使用】

    阿里云OSS对象存储搭配CDN加速使用 什么是CDN? 为什么选择阿里云CDN? 按流量计费说明 CDN按流量计费费如下: OSS外网流出流量标准收费如下: 步骤一:准备工作 步骤二.开通CDN 涉及 ...

  5. 阿里云OSS对象存储搭建网盘教程

    阿里云OSS对象存储高可靠数据存储服务,使用OSS对象存储搭建个人网盘或企业网盘,存储可靠性高下载不限速,当然阿里云推出了自家的网盘,码笔记分享使用OSS对象存储搭建个人网盘或企业网盘的方法: 使用O ...

  6. 【Typora图床设置】Typora图片上传和阿里云OSS对象存储

    问题描述 因为Typora是纯文本编辑器,所以无法导入图片,但是可以显示图片.换句话说,Typora文档中保存的图片实际上是图片的存储地址,Typora会根据这个地址来显示图片.我们在使用Typora ...

  7. Java使用阿里云OSS对象存储上传图片

    示例说明   该案例是OSS Java SDK的示例程序,您可以修改endpoint.accessKeyId.accessKeySecret.bucketName后直接运行. 本示例中的并不包括OSS ...

  8. 6、阿里云OSS对象存储手把手学习及企业使用方案

    文章目录 1.什么是分布式文件系统 2.图片存储解决方案 3.阿里云OSS对象存储 3.1.开通oss访问 3.2.购买服务 3.3.基本概念 3.4.创建一个bucket 3.5.创建AccessK ...

  9. 配置阿里云OSS对象存储服务

    配置阿里云OSS对象存储服务 导入阿里云OSS依赖 <dependency><groupId>com.aliyun.oss</groupId><artifac ...

  10. 【谷粒商城之整合阿里云OSS对象存储】

    本笔记内容为尚硅谷谷粒商城整合阿里云OSS对象存储部分 目录 一 .简介 二.云存储开通与使用 1.开通阿里云对象存储服务 2.创建bucket 3.创建子用户(获取密钥访问OSS服务器) 给该子账户 ...

最新文章

  1. XLearning - 深度学习调度平台
  2. spring security3.x学习(12)_remember me
  3. cin输入字符串怎么结束_翻遍全网,只为让你记住这些输入输出函数
  4. 玩转 Redis 集群之 Sentinel
  5. Docker nginx部署阿里https(最新的方案)
  6. 解决zabbix的cannot allocate shared memory of size错误
  7. Web框架——Flask系列之数据库迁移(二十)
  8. springboot设置默认值_spring boot jpa存储数据的默认值为java的默认值
  9. 如何编写代码解决问题,初学者指南
  10. 微课|Python列表、字典、集合、字符串对象常用方法串讲
  11. TSP旅行商问题的Hopfield求解过程
  12. NYOJ 82:迷宫寻宝(一)(BFS)
  13. Spring Boot 接口文档工具对比
  14. 为老电脑装linux系统
  15. 电视剧:我的团长我的团
  16. linux eqep驱动框架,【活动结束】《基于28377的伺服驱动系统调试》第一期/共......
  17. 空间句法(二)——Axwoman 6.0
  18. 《三体》中的经典名句
  19. matlab 虚位温,大气边界层湍流基础
  20. word查找参考文献引用格式

热门文章

  1. GAN——对抗生成网络
  2. Armbian 笔记一_初次登陆配置 Armbian 系统
  3. 小米手机liveplayer安装包_小米直播助手手机版官方下载
  4. 直播 | 初探云原生应用管理之:聊聊 Tekton 项目
  5. R语言 绘制三维散点图的预测曲面
  6. java 构造函数的作用_Java中构造函数的作用(转)
  7. 360金融第一季度财报:收入32亿,疫情极限测试下走出的优质公司
  8. 南京晓庄学院计算机专业咋样,南京晓庄学院有哪些专业及什么专业好
  9. kafka 重新分配节点_kafka扩容节点和partitions迁移
  10. java 文件压缩并设置密码解压