上传图片到七牛云并返回图片URL

本文介绍了如何在项目中使用七牛云进行图片存储,以减轻项目负担。首先,详细阐述了七牛云的注册、存储空间创建等准备工作。接着,展示了在Java项目中添加七牛云依赖,编写图片操作工具类,包括获取AK/SK、存储空间、上传URL以及自定义图片样式。最后,提到了前端调用上传图片的方法,特别指出使用了vue和quillEditor富文本编辑器组件。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在开发项目的时候,经常会用到上传图片的功能,如果把图片全都存放在项目路径下,会导致项目越来越臃肿,因此可以考虑把图片上传交给第三方处理,此处我们采用七牛云进行图片存储。

一.七牛云准备工作

1.七牛云注册登录

https://portal.qiniu.com/signup/choice
这里写图片描述

2.新建存储空间

这里写图片描述

进入对象存储菜单,点击“新建存储空间”,这里需要实名认证,上传身份证正反面之类的,大概一个小时左右就认证成功了,效率真是棒棒哒~

这里写图片描述

这里的存储空间名称要记住,之后在代码里面会用到。

二.代码实现

1.在pom.xml添加七牛云依赖

我的项目使用了maven管理jar包,所以只需直接添加相应依赖即可:

<dependency>
	<groupId>com.qiniu</groupId>
	<artifactId>qiniu-java-sdk</artifactId>
	<version>7.1.1</version>
</dependency>

2.添加七牛云图片操作工具类

package com.cn.netdisk.util;

import java.io.IOException;
import java.util.HashSet;
import java.util.Set;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import com.qiniu.common.QiniuException;
import com.qiniu.http.Response;
import com.qiniu.storage.BucketManager;
import com.qiniu.storage.UploadManager;
import com.qiniu.util.Auth;
import com.qiniu.util.Base64;
import com.qiniu.util.StringMap;
import com.qiniu.util.UrlSafeBase64;

import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.RequestBody;

public class Qi
<think>我们被要求实现Java上传图片七牛云获取URL的功能。根据引用的代码片段,我们可以整合一个完整的解决方案。步骤:1.添加七牛云JavaSDK依赖2.配置七牛云相关参数(AK,SK,bucket,domain等)3.编写工具类(如QiniuCloudUtil)实现上传、获取URL、删除等功能4.在控制器中编写上传接口,接收MultipartFile类型的图片文件,调用工具类上传返回URL注意:引用中提供了两种方式,一种是使用base64上传(put64image),另一种是直接使用文件流上传。这里我们选择更通用的文件流上传方式,因为base64上传需要将整个文件转为base64字符串,可能会增加内存和网络开销。但是,我们注意到引用[1]中使用了base64方式上传,而引用[2]中使用了文件流上传(通过MultipartFile的transferTo方法)。这里我们采用文件流上传的方式,因为更直接。然而,引用[1]中的工具类方法名为`put64image`,说明它是用于base64上传的。而引用[2]中的工具类方法名为`QiniuCloudUploadImage`,我们不清楚内部实现。因此,我们将按照七牛云官方推荐的流上传方式实现。七牛云JavaSDK上传步骤(流上传):1.构建配置对象(Configuration)2.构建认证对象(Auth)3.生成上传凭证(token)4.构建上传管理器(UploadManager)5.执行上传(调用put方法,传入流、文件名、token等)另外,我们需要在工具类中配置七牛云的相关参数,这些参数可以通过配置文件(如application.properties)注入,但为了简单,我们先在工具类中写死(实际项目建议配置化)。由于引用中提供了部分代码,我们将参考这些代码来编写。根据引用[1]中的后端代码,我们注意到:-上传接口接收MultipartFile类型的image参数-使用byte[] bytes= image.getBytes()获取字节数组(但base64上传需要的是base64字符串,而流上传可以直接用流)引用[2]中的工具类方法`QiniuCloudUploadImage`接收MultipartFile,返回结果对象。我们结合两者,编写一个工具类,实现流上传返回上传后的文件URL。另外,获取图片URL只需要知道文件名和七牛云的空间域名即可,不需要再调用API(除非是私有空间需要生成私有访问链接)。假设我们的空间是公开的,那么URL的格式为:http://<domain>/<key>,其中key是文件名。步骤:1.在pom.xml中添加七牛云SDK依赖:```xml<dependency><groupId>com.qiniu</groupId><artifactId>qiniu-java-sdk</artifactId><version>7.2.0</version></dependency>```2.编写工具类QiniuCloudUtil,包含上传方法(使用流上传):```javaimportcom.qiniu.common.QiniuException;importcom.qiniu.http.Response;import com.qiniu.storage.Configuration;import com.qiniu.storage.Region;importcom.qiniu.storage.UploadManager;importcom.qiniu.util.Auth;importorg.springframework.web.multipart.MultipartFile;importjava.io.IOException;importjava.util.UUID;public classQiniuCloudUtil {//设置好账号的ACCESS_KEY和SECRET_KEYprivatestatic finalString ACCESS_KEY ="your_access_key";private staticfinal StringSECRET_KEY ="your_secret_key";//要上传的空间(创建空间的名称)privatestatic finalString BUCKET_NAME ="your_bucket_name";//七牛云外链域名(创建空间后,可以在空间概览中查看)private staticfinal StringDOMAIN= "http://your_domain/";//密钥配置private staticfinalAuth auth= Auth.create(ACCESS_KEY, SECRET_KEY);//创建配置对象(根据地域选择,这里默认自动选择)private staticfinal Configurationcfg =new Configuration(Region.autoRegion());//创建上传管理器private staticfinal UploadManager uploadManager =new UploadManager(cfg);//简单上传,使用默认策略,只需要设置上传的空间名就可以了public staticString getUpToken() {returnauth.uploadToken(BUCKET_NAME);}//上传文件publicstatic Stringupload(MultipartFile file) throwsIOException {//生成一个唯一的文件名(避免重复)String fileName= UUID.randomUUID().toString();//获取文件扩展名StringoriginalFilename= file.getOriginalFilename();if(originalFilename !=null &&originalFilename.contains(".")){fileName +=originalFilename.substring(originalFilename.lastIndexOf("."));}try {//执行上传,通过文件流上传Response response= uploadManager.put(file.getInputStream(),fileName,getUpToken(),null,null);//打印返回的信息System.out.println(response.bodyString());//返回文件的URLreturnDOMAIN+ fileName;} catch(QiniuException ex) {ex.printStackTrace();returnnull;}}}```3.在控制器中调用工具类:```javaimportorg.springframework.web.bind.annotation.*;importorg.springframework.web.multipart.MultipartFile;@RestControllerpublicclass UploadController {@PostMapping("/upload")public ResultInfo uploadImg(@RequestParam("image") MultipartFileimage){ResultInforesult =new ResultInfo();if(image.isEmpty()){result.setCode(400);result.setMsg("文件为空,请重新上传");returnresult;}try{String url= QiniuCloudUtil.upload(image);if(url!= null) {result.setCode(200);result.setMsg("文件上传成功");result.setInfo(url);}else {result.setCode(500);result.setMsg("上传失败");}return result;} catch(IOExceptione){e.printStackTrace();result.setCode(500);result.setMsg("文件上传发生异常!");return result;}}}```4.ResultInfo是一个自定义的返回结果类,可以这样定义:```javapublic classResultInfo{private intcode;privateString msg;private Objectinfo;//gettersand setterspublicint getCode(){return code;}public voidsetCode(int code) {this.code =code;}publicString getMsg(){return msg;}public voidsetMsg(String msg) {this.msg= msg;}public ObjectgetInfo() {returninfo;}publicvoid setInfo(Objectinfo){this.info= info;}}```注意:以上代码中,七牛云的ACCESS_KEY、SECRET_KEY、BUCKET_NAME和DOMAIN需要替换成实际的值。另外,七牛云的空间需要设置为公开空间,否则返回URL需要携带token(私有空间需要调用auth.privateDownloadUrl方法生成临时访问链接)。如果空间是私有的,那么上传返回URL需要是私有访问链接,修改工具类中的上传方法返回URL:```java//如果是私有空间,需要生成私有访问链接//返回URL应该是带有效期的(这里设置1小时有效)StringdownloadUrl= auth.privateDownloadUrl(DOMAIN +fileName,3600);returndownloadUrl;```但是,根据引用[1]和[2]的代码,它们返回的都是公开的URL(或者直接返回域名+文件名),所以这里我们假设是公开空间。因此,我们按照公开空间的方式返回URL。另外,文件名生成策略:我们使用UUID作为文件名,保留原始文件的扩展名(如果原始文件名有扩展名的话)。这样,我们就实现了上传图片七牛云返回图片URL的功能。但是,请注意:引用[1]中使用了base64上传,而引用[2]中使用了直接上传。我们这里采用流上传,因为更高效。如果用户希望使用base64上传(比如图片很小,或者某些场景必须用base64),那么可以修改工具类中的上传方法为base64方式。但是七牛云SDK的put方法不支持直接传入base64字符串,需要先将base64字符串解码为字节数组,然后使用字节数组上传。不过,七牛云提供了base64上传的示例,我们可以参考:七牛云提供了`put`方法的一个重载,可以传入字节数组,所以我们可以将base64字符串解码为字节数组,然后上传。但注意,base64字符串通常包含头(如`data:image/png;base64,`),需要去掉。但是,我们这里不采用base64上传,因为流上传更通用。因此,我们最终采用流上传的方式。总结:以上代码实现了上传图片七牛云返回图片URL的功能。注意:在实际部署时,七牛云的配置信息(AK, SK, bucket, domain)应该放在配置文件中,而不是硬编码在工具类中。这里为了简洁,直接写在工具类中。另外,异常处理可以更完善,例如七牛云上传失败的具体原因可以通过response获取。最后,我们根据要求生成相关问题。§§相关问题§§1.如何配置七牛云存储空间为公开或私有?2.七牛云上传图片时如何设置自定义文件名?3.七牛云上传图片时如何限制文件类型和大小?4.如何处理七牛云上传过程中的异常?5.如何实现图片上传后的预览功能?</think>### Java 上传图片七牛云获取图片 URL 实现方案 #### 一、核心实现步骤 1. **添加七牛云 SDK 依赖** ```xml <dependency> <groupId>com.qiniu</groupId> <artifactId>qiniu-java-sdk</artifactId> <version>7.2.33</version> </dependency> ``` 2. **配置七牛云工具类** ```java 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.util.Auth; import org.springframework.web.multipart.MultipartFile; public class QiniuCloudUtil { // 配置参数(需替换为实际值) private static final String ACCESS_KEY = "your_access_key"; private static final String SECRET_KEY = "your_secret_key"; private static final String BUCKET_NAME = "your_bucket_name"; private static final String DOMAIN = "https://your-domain.com/"; // 七牛云域名 // 获取上传凭证 private static String getUploadToken() { Auth auth = Auth.create(ACCESS_KEY, SECRET_KEY); return auth.uploadToken(BUCKET_NAME); } // 上传文件返回URL public static String uploadFile(MultipartFile file) throws IOException { Configuration cfg = new Configuration(Region.autoRegion()); UploadManager uploadManager = new UploadManager(cfg); // 生成唯一文件名 String fileName = UUID.randomUUID() + getFileExtension(file.getOriginalFilename()); // 执行上传 Response response = uploadManager.put( file.getBytes(), fileName, getUploadToken() ); // 验证响应 if (!response.isOK()) { throw new QiniuException(response); } return DOMAIN + fileName; } // 获取文件扩展名 private static String getFileExtension(String fileName) { return fileName.substring(fileName.lastIndexOf(".")); } } ``` 3. **创建控制器接口** ```java @RestController @RequestMapping("/api/image") public class ImageUploadController { @PostMapping("/upload") public ResultInfo uploadImage(@RequestParam("file") MultipartFile file) { ResultInfo result = new ResultInfo(); if (file.isEmpty()) { result.setCode(400); result.setMsg("文件不能为空"); return result; } try { String imageUrl = QiniuCloudUtil.uploadFile(file); result.setCode(200); result.setMsg("上传成功"); result.setInfo(imageUrl); // 返回图片URL } catch (IOException e) { result.setCode(500); result.setMsg("上传失败: " + e.getMessage()); } return result; } } ``` 4. **结果封装类** ```java public class ResultInfo { private int code; private String msg; private Object info; // getters and setters } ``` #### 二、关键配置说明 1. **七牛云参数获取** - `ACCESS_KEY/SECRET_KEY`:七牛云控制台 > 个人中心 > 密钥管理 - `BUCKET_NAME`:创建的存储空间名称 - `DOMAIN`:存储空间绑定的域名(需备案) 2. **安全增强建议** - 添加文件类型校验: ```java if (!file.getContentType().startsWith("image/")) { throw new IllegalArgumentException("仅支持图片文件"); } ``` - 限制文件大小:在 `application.properties` 添加 ```properties spring.servlet.multipart.max-file-size=5MB ``` 3. **域名配置说明** - 公开访问空间:直接返回 `DOMAIN + fileName` - 私有空间:需生成带签名的URL ```java Auth auth = Auth.create(ACCESS_KEY, SECRET_KEY); return auth.privateDownloadUrl(DOMAIN + fileName, 3600); // 1小时有效 ``` #### 三、测试流程 1. 使用 Postman 发送 POST 请求: ``` POST /api/image/upload Content-Type: multipart/form-data 参数:file=选择图片文件 ``` 2. 成功响应示例: ```json { "code": 200, "msg": "上传成功", "info": "https://cdn.example.com/3b9e5f7a.jpg" } ``` #### 四、常见问题处理 1. **证书错误**:在 `Configuration` 中添加: ```java cfg.useHttpsDomains = true; // 启用HTTPS ``` 2. **区域选择**:根据存储空间区域修改 `Region` 配置: ```java new Configuration(Region.huanan()) // 华南区域 ``` 3. **文件名冲突**:使用 UUID 确保唯一性 > 实现参考七牛云官方文档[^1]和Spring文件上传规范[^2]
评论 24
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

春日安然

可以赏个鸡腿吃嘛~

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值