热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

开发笔记:Springboot上传文件对象存储

篇首语:本文由编程笔记#小编为大家整理,主要介绍了Springboot上传文件--对象存储相关的知识,希望对你有一定的参考价值。

篇首语:本文由编程笔记#小编为大家整理,主要介绍了Springboot上传文件--对象存储相关的知识,希望对你有一定的参考价值。






七牛云对象存储–新建空间
  1. 找到对象存储,点击出现以下页面
    在这里插入图片描述
  2. 空间管理–》新建空间–》填写信息–》确定
    在这里插入图片描述
    在这里插入图片描述
    这里有30天的试用期,可以先不用绑定自定义域名
  3. 点击下面的空间
    在这里插入图片描述
  4. 域名管理–》绑定域名
    在这里插入图片描述
  5. 添加域名,域名要是海外的,不然没有备案,不可以添加
    在这里插入图片描述
    我这里域名未备案就不绑定域名了

springboot上传文件–对象存储(七牛云)

官方文档


  1. 导入java sdk依赖

<dependency>
<groupId>com.qiniugroupId>
<artifactId>qiniu-java-sdkartifactId>
<version>[7.7.0, 7.7.99]version>
dependency>

  1. Java SDK依赖的第三方库及其版本

<dependency>
<groupId>com.squareup.okhttp3groupId>
<artifactId>okhttpartifactId>
<version>3.14.2version>
<scope>compilescope>
dependency>
<dependency>
<groupId>com.google.code.gsongroupId>
<artifactId>gsonartifactId>
<version>2.8.5version>
<scope>compilescope>
dependency>
<dependency>
<groupId>com.qiniugroupId>
<artifactId>happy-dns-javaartifactId>
<version>0.1.6version>
<scope>testscope>
dependency>
<dependency>
<groupId>junitgroupId>
<artifactId>junitartifactId>
<version>4.12version>
<scope>testscope>
dependency>

JAVA SDK依赖和SDK依赖的第三方库都需要导入项目中&#xff0c;两者缺一不可


文件上传–简单上传


  1. 代码示例如下&#xff1a;

&#64;Test
public void testPrint() {
//构造一个带指定 Region 对象的配置类
//Region.region2()对应创建的空间区域&#xff0c;刚刚创建空间我使用了华南&#xff0c;对应region2();
Configuration cfg &#61; new Configuration(Region.region2());
//...其他参数参考类注释
UploadManager uploadManager &#61; new UploadManager(cfg);
//...生成上传凭证&#xff0c;然后准备上传
String accessKey &#61; "BITG3xjH_kr2w7uxDiMW1udeIthyJqhLENtf-4Ks";
String secretKey &#61; "yjrgG_1AhJVQt4fFrb4Vd5y6Lslz7ba06fv-gaPR";
String bucket &#61; "dxj1016";//空间名称
//如果是Windows情况下&#xff0c;格式是 D:\\\\qiniu\\\\test.png;本地文件路径
String localFilePath &#61; "D:\\\\赵丽颖\\\\微信图片_20200924135429.jpg";
//默认不指定key的情况下&#xff0c;以文件内容的hash值作为文件名
String key &#61; null;
Auth auth &#61; Auth.create(accessKey, secretKey);
String upToken &#61; auth.uploadToken(bucket);
try {
Response response &#61; uploadManager.put(localFilePath, key, upToken);
//解析上传成功的结果
DefaultPutRet putRet &#61; new Gson().fromJson(response.bodyString(), DefaultPutRet.class);
System.out.println(putRet.key);
System.out.println(putRet.hash);
} catch (QiniuException ex) {
Response r &#61; ex.response;
System.err.println(r.toString());
try {
System.err.println(r.bodyString());
} catch (QiniuException ex2) {
//ignore
}
}
}

两个安全秘钥&#xff1a;
在这里插入图片描述
在这里插入图片描述
configuration里面的参数&#xff1a;创建空间的时候选的哪个区域就对应这里的方法&#xff0c;我的刚刚创建空间的时候选择的是华南&#xff0c;所以这里使用了region2()方法
在这里插入图片描述
9. 测试看文件是否上传到七牛云
在这里插入图片描述


实践–上传头像


  1. 工具类用于存储文件到七牛云

public class MyUtil {
/**
* 文件上传到七牛云
* &#64;return
*/

public static String testPrint(MultipartFile pictureFile) throws IOException {
//构造一个带指定 Region 对象的配置类
//Region.region2()对应创建的空间区域&#xff0c;刚刚创建空间我使用了华南&#xff0c;对应region2();
Configuration cfg &#61; new Configuration(Region.region2());
//...其他参数参考类注释
UploadManager uploadManager &#61; new UploadManager(cfg);
//...生成上传凭证&#xff0c;然后准备上传
String accessKey &#61; "BITG3xjH_kr2w7uxDiMW1udeIthyJqhLENtf-4Ks";
String secretKey &#61; "yjrgG_1AhJVQt4fFrb4Vd5y6Lslz7ba06fv-gaPR";
String bucket &#61; "dxj1016";//空间名称
//如果是Windows情况下&#xff0c;格式是 D:\\\\qiniu\\\\test.png;本地文件路径
// String localFilePath &#61; "D:\\\\赵丽颖\\\\微信图片_20200924135429.jpg";
InputStream inputStream &#61; pictureFile.getInputStream();
//默认不指定key的情况下&#xff0c;以文件内容的hash值作为文件名
String key &#61; null;
Auth auth &#61; Auth.create(accessKey, secretKey);
String upToken &#61; auth.uploadToken(bucket);
try {
Response response &#61; uploadManager.put(inputStream, key, upToken,null,null);
//解析上传成功的结果
DefaultPutRet putRet &#61; new Gson().fromJson(response.bodyString(), DefaultPutRet.class);
System.out.println(putRet.key);
System.out.println(putRet.hash);
String url &#61; "http://qu6hzlc6e.hn-bkt.clouddn.com/" &#43; putRet.hash;
return url;
} catch (QiniuException ex) {
Response r &#61; ex.response;
System.err.println(r.toString());
try {
System.err.println(r.bodyString());
} catch (QiniuException ex2) {
//ignore
}
}
return null;
}
}

这里参数为MultipartFile&#xff0c;如果是简单上传那里使用文件路径Response response &#61; uploadManager.put(localFilePath, key, upToken);那么参数无法获取文件路径&#xff0c;所以查看put源码可以知道&#xff0c;还有一个方法是使用inputStream参数的 Response response &#61; uploadManager.put(inputStream, key, upToken,null,null);


  1. controller层

package com.spring.campus_express_delivery.controller;
import com.google.gson.Gson;
import com.qiniu.common.QiniuException;
import com.qiniu.http.Response;
import com.qiniu.storage.Configuration;
import com.qiniu.storage.Region;
import com.qiniu.storage.UploadManager;
import com.qiniu.storage.model.DefaultPutRet;
import com.qiniu.util.Auth;
import com.spring.campus_express_delivery.entity.Users;
import com.spring.campus_express_delivery.util.JwtToken;
import com.spring.campus_express_delivery.util.MyUtil;
import com.spring.campus_express_delivery.util.ResponseEntity;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import java.io.IOException;
import java.io.InputStream;
import java.text.ParseException;
&#64;CrossOrigin
&#64;Controller
&#64;RequestMapping("/test")
&#64;Api(value &#61; "TestObject", description &#61; "文件上传测试")
public class TestObject {
/**
* 修改自己信息接口
* &#64;return
* &#64;throws IOException
*/

&#64;ApiOperation("修改自己信息")
&#64;PostMapping("/web/test_update_info")
&#64;ResponseBody
public String testUpdateUserInfoByMyself(&#64;RequestParam(required &#61; false) MultipartFile pictureFile) throws IOException, ParseException {
String pic &#61; MyUtil.testPrint(pictureFile);
return pic;
}
}

  1. 使用swagger2测试接口&#xff0c;如果有返回文件路径访问得到文件就说明成功了

springboot上传文件–前端传递base64字段串形式过来

参考资料

工具类


  1. 图片转换为base64编码的字符串方法

public static String GetImageStr()
{//将图片文件转化为字节数组字符串&#xff0c;并对其进行Base64编码处理
String imgFile &#61; "D:\\\\赵丽颖\\\\微信图片_20200924135436.jpg";//待处理的图片
InputStream in &#61; null;
byte[] data &#61; null;
//读取图片字节数组
try
{
in &#61; new FileInputStream(imgFile);
data &#61; new byte[in.available()];
in.read(data);
in.close();
}
catch (IOException e)
{
e.printStackTrace();
}
//对字节数组Base64编码
BASE64Encoder encoder &#61; new BASE64Encoder();
return encoder.encode(data);//返回Base64编码过的字节数组字符串
}

  1. base64编码的字符串转换为图片方法&#xff1b;这里用到下面15步骤的方法testPrint()

public static String GenerateImagebendi(String imgStr)
{ //对字节数组字符串进行Base64解码并生成图片
if (imgStr &#61;&#61; null) //图像数据为空
return null;
BASE64Decoder decoder &#61; new BASE64Decoder();
try
{
//Base64解码
byte[] b &#61; decoder.decodeBuffer(imgStr);
for(int i&#61;0;i<b.length;&#43;&#43;i)
{
if(b[i]<0)
{//调整异常数据
b[i]&#43;&#61;256;
}
}
String imgFilePath &#61; "D:\\\\赵丽颖\\\\"&#43;System.currentTimeMillis() &#43; UUID.randomUUID().toString().replace(".", "").substring(0, 6)&#43;".jpg";//新生成的图片
OutputStream out &#61; new FileOutputStream(imgFilePath);
out.write(b);
out.flush();
out.close();
String filePath &#61; testPrint(imgFilePath);//将图片存储到七牛云&#xff0c;返回图片访问链接
return filePath;
}
catch (Exception e)
{
return null;
}
}

  1. 将图片存储到七牛云并返回图片访问链接的方法&#xff0c;参数是字符串类型的&#xff0c;刚好是图片在本地的存放位置。这个方法可以对照上面的实践–上传头像和简单上传那里的代码&#xff0c;主要是参数不同

public static String testPrint(String localFilePath) {
//构造一个带指定 Region 对象的配置类
//Region.region2()对应创建的空间区域&#xff0c;刚刚创建空间我使用了华南&#xff0c;对应region2();
Configuration cfg &#61; new Configuration(Region.region2());
//...其他参数参考类注释
UploadManager uploadManager &#61; new UploadManager(cfg);
//...生成上传凭证&#xff0c;然后准备上传
String accessKey &#61; "BITG3xjH_kr2w7uxDiMW1udeIthyJqhLENtf-4Ks";
String secretKey &#61; "yjrgG_1AhJVQt4fFrb4Vd5y6Lslz7ba06fv-gaPR";
String bucket &#61; "dxj1016";//空间名称
//如果是Windows情况下&#xff0c;格式是 D:\\\\qiniu\\\\test.png;本地文件路径
//String localFilePath &#61; "D:\\\\赵丽颖\\\\微信图片_20200924135429.jpg";
//默认不指定key的情况下&#xff0c;以文件内容的hash值作为文件名
String key &#61; null;
Auth auth &#61; Auth.create(accessKey, secretKey);
String upToken &#61; auth.uploadToken(bucket);
try {
Response response &#61; uploadManager.put(localFilePath, key, upToken);
//解析上传成功的结果
DefaultPutRet putRet &#61; new Gson().fromJson(response.bodyString(), DefaultPutRet.class);
System.out.println(putRet.key);
System.out.println(putRet.hash);
String url &#61; "http://qu6hzlc6e.hn-bkt.clouddn.com/" &#43; putRet.hash;
return url;
} catch (QiniuException ex) {
Response r &#61; ex.response;
System.err.println(r.toString());
try {
System.err.println(r.bodyString());
} catch (QiniuException ex2) {
//ignore
}
}
return null;
}

  1. 写个测试类测试一下是否有返回图片的访问链接&#xff0c;是否访问成功

&#64;Test
public void testBase() {
String strImg &#61; GetImageStr();
String pic &#61; GenerateImagebendi(strImg);
System.out.println(pic);
}
/*
执行结果&#xff1a;
FnSeVzjrn_pWsww6D500Ore6YmjA
FnSeVzjrn_pWsww6D500Ore6YmjA
http://qu6hzlc6e.hn-bkt.clouddn.com/FnSeVzjrn_pWsww6D500Ore6YmjA
*/

这里为了方便使用了图片转换为base64编码的字符串然后再转换为图片的方式&#xff0c;如果是前端传递过来base64编码的字符串&#xff0c;那么就只要使用14步骤的base64编码的字符串转换为图片方法GenerateImagebendi&#xff0c;将前端传递过来的base64字符串作为参数&#xff0c;进行测试






推荐阅读
  • 图像因存在错误而无法显示 ... [详细]
  • C++字符字符串处理及字符集编码方案
    本文介绍了C++中字符字符串处理的问题,并详细解释了字符集编码方案,包括UNICODE、Windows apps采用的UTF-16编码、ASCII、SBCS和DBCS编码方案。同时说明了ANSI C标准和Windows中的字符/字符串数据类型实现。文章还提到了在编译时需要定义UNICODE宏以支持unicode编码,否则将使用windows code page编译。最后,给出了相关的头文件和数据类型定义。 ... [详细]
  • 如何在php文件中添加图片?
    本文详细解答了如何在php文件中添加图片的问题,包括插入图片的代码、使用PHPword在载入模板中插入图片的方法,以及使用gd库生成不同类型的图像文件的示例。同时还介绍了如何生成一个正方形文件的步骤。希望对大家有所帮助。 ... [详细]
  • Android自定义控件绘图篇之Paint函数大汇总
    本文介绍了Android自定义控件绘图篇中的Paint函数大汇总,包括重置画笔、设置颜色、设置透明度、设置样式、设置宽度、设置抗锯齿等功能。通过学习这些函数,可以更好地掌握Paint的用法。 ... [详细]
  • AFNetwork框架(零)使用NSURLSession进行网络请求
    本文介绍了AFNetwork框架中使用NSURLSession进行网络请求的方法,包括NSURLSession的配置、请求的创建和执行等步骤。同时还介绍了NSURLSessionDelegate和NSURLSessionConfiguration的相关内容。通过本文可以了解到AFNetwork框架中使用NSURLSession进行网络请求的基本流程和注意事项。 ... [详细]
  • 在Android开发中,使用Picasso库可以实现对网络图片的等比例缩放。本文介绍了使用Picasso库进行图片缩放的方法,并提供了具体的代码实现。通过获取图片的宽高,计算目标宽度和高度,并创建新图实现等比例缩放。 ... [详细]
  • Mac OS 升级到11.2.2 Eclipse打不开了,报错Failed to create the Java Virtual Machine
    本文介绍了在Mac OS升级到11.2.2版本后,使用Eclipse打开时出现报错Failed to create the Java Virtual Machine的问题,并提供了解决方法。 ... [详细]
  • Android Studio Bumblebee | 2021.1.1(大黄蜂版本使用介绍)
    本文介绍了Android Studio Bumblebee | 2021.1.1(大黄蜂版本)的使用方法和相关知识,包括Gradle的介绍、设备管理器的配置、无线调试、新版本问题等内容。同时还提供了更新版本的下载地址和启动页面截图。 ... [详细]
  • XML介绍与使用的概述及标签规则
    本文介绍了XML的基本概念和用途,包括XML的可扩展性和标签的自定义特性。同时还详细解释了XML标签的规则,包括标签的尖括号和合法标识符的组成,标签必须成对出现的原则以及特殊标签的使用方法。通过本文的阅读,读者可以对XML的基本知识有一个全面的了解。 ... [详细]
  • 本文介绍了在Vue项目中如何结合Element UI解决连续上传多张图片及图片编辑的问题。作者强调了在编码前要明确需求和所需要的结果,并详细描述了自己的代码实现过程。 ... [详细]
  • 本文介绍了Android 7的学习笔记总结,包括最新的移动架构视频、大厂安卓面试真题和项目实战源码讲义。同时还分享了开源的完整内容,并提醒读者在使用FileProvider适配时要注意不同模块的AndroidManfiest.xml中配置的xml文件名必须不同,否则会出现问题。 ... [详细]
  • Imtryingtofigureoutawaytogeneratetorrentfilesfromabucket,usingtheAWSSDKforGo.我正 ... [详细]
  • 先看官方文档TheJavaTutorialshavebeenwrittenforJDK8.Examplesandpracticesdescribedinthispagedontta ... [详细]
  • iOS超签签名服务器搭建及其优劣势
    本文介绍了搭建iOS超签签名服务器的原因和优势,包括不掉签、用户可以直接安装不需要信任、体验好等。同时也提到了超签的劣势,即一个证书只能安装100个,成本较高。文章还详细介绍了超签的实现原理,包括用户请求服务器安装mobileconfig文件、服务器调用苹果接口添加udid等步骤。最后,还提到了生成mobileconfig文件和导出AppleWorldwideDeveloperRelationsCertificationAuthority证书的方法。 ... [详细]
  • 注意:以下分析都是基于Retrofit2转载请注明出处:http:blog.csdn.netevan_manarticledetails51320637本节是《Retrofit的使 ... [详细]
author-avatar
好的吧
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有