Java實(shí)現(xiàn)上傳網(wǎng)絡(luò)圖片到七牛云存儲(chǔ)詳解
前言
最近陽(yáng)了,第二條杠紅的發(fā)紫,真難受啊,但是吧,博客上有個(gè)bug,不解決感覺比陽(yáng)了還難受。
話還是要從博客的圖片顯示不出來(lái)這里說(shuō)起,當(dāng)時(shí)做的時(shí)候,在發(fā)文章這里,感覺沒有封面的話,文章會(huì)很孤單,所以就設(shè)計(jì)了個(gè)封面這塊兒。但是,封面如果太邋遢也還不如沒有。
所以我就從網(wǎng)上的一個(gè)接口里面隨機(jī)取的一些精美圖片,本來(lái)好好的,結(jié)果今天一看,那個(gè)接口報(bào)錯(cuò)403了,當(dāng)時(shí)就想著,這樣做太依賴別人了,什么東西都得掌控在自己手里,不然出問(wèn)題了難受的還是自己。
正好借這個(gè)機(jī)會(huì),就重新設(shè)計(jì)了下,先從接口中取,如果接口中的圖片能看,則用這個(gè)圖片,順便將這個(gè)圖片傳至七牛云存儲(chǔ)中,否則就隨機(jī)從七牛云存儲(chǔ)中指定些圖片展示出來(lái),這樣就不會(huì)受制于人。
效果圖

直接將圖片傳至七牛云中,給我們返回該圖片的地址。
代碼實(shí)現(xiàn)
因?yàn)槠吲T粕蟼鲌D片的時(shí)候,傳遞的是MultipartFile類型,所以我們需要將網(wǎng)絡(luò)圖片utl轉(zhuǎn)換成流,然后在轉(zhuǎn)換成MultipartFile,接著使用七牛云提供的方法上傳即可。
下面我們先看看怎么將網(wǎng)絡(luò)url轉(zhuǎn)換成MultipartFile,這個(gè)代碼網(wǎng)上很多,大家可以隨便搜一個(gè)放上來(lái)就行,我這邊封裝了個(gè)工具類:FilesUtil
package com.shiyi.util;
import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
import org.apache.http.entity.ContentType;
import org.apache.pdfbox.io.IOUtils;
import org.springframework.mock.web.MockMultipartFile;
import org.springframework.web.multipart.MultipartFile;
import java.io.*;
import java.net.HttpURLConnection;
import java.net.URL;
/**
* @author: muxiongxiong
* @date: 2022年12月29日 15:35
* 博客:https://blog.csdn.net/qq_34137397
* 個(gè)人站:https://www.穆雄雄.com
* 個(gè)人站:https://www.muxiongxiong.cn
* @Description: 類的描述
*/
public class FilesUtil {
/**
* 根據(jù)地址獲得數(shù)據(jù)的輸入流
*
* @param strUrl 網(wǎng)絡(luò)連接地址
* @return url的輸入流
*/
public static InputStream getInputStreamByUrl(String strUrl) {
HttpURLConnection conn = null;
try {
URL url = new URL(strUrl);
conn = (HttpURLConnection) url.openConnection();
conn.setRequestMethod("GET");
conn.setConnectTimeout(20 * 1000);
final ByteArrayOutputStream output = new ByteArrayOutputStream();
IOUtils.copy(conn.getInputStream(), output);
return new ByteArrayInputStream(output.toByteArray());
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
if (conn != null) {
conn.disconnect();
}
} catch (Exception e) {
e.printStackTrace();
}
}
return null;
}
/**
* 將網(wǎng)絡(luò)地址轉(zhuǎn)換成MultipartFile
* @param strUrl
* @return
*/
public static MultipartFile onlineAddressTransferFile(String strUrl){
MultipartFile file = null;
try {
String fileName = strUrl.substring(strUrl.lastIndexOf("/") + 1);
InputStream stream = getInputStreamByUrl(strUrl);
if (!ObjectUtils.isEmpty(stream)) {
file = new MockMultipartFile(fileName, fileName, "", stream);
return file;
}
}catch (Exception exception){
exception.printStackTrace();
}
return file;
}
}在調(diào)用的時(shí)候我們這樣調(diào):
/**
* 手動(dòng)上傳網(wǎng)絡(luò)圖片
*/
@GetMapping(value = "/uploadFm")
public ResponseResult uploadFm(){
MultipartFile multipartFile = FilesUtil.onlineAddressTransferFile("https://img-community.csdnimg.cn/images/86f32eac875e42af9ed9e91b809dc7d8.png");
return cloudOssService.upload(multipartFile);
}剩下的就是七牛云里面的方法了,這邊一起放上來(lái)吧:
CloudOssService接口代碼:
package com.shiyi.service;
import com.shiyi.common.ResponseResult;
import org.springframework.web.multipart.MultipartFile;
public interface CloudOssService {
/**
* 上傳
* @param file 文件
* @return
*/
ResponseResult upload(MultipartFile file);
/**
* 批量刪除文件
* @param key 文件名
* @return
*/
ResponseResult delBatchFile(String ...key);
}CloudOssServiceImpl實(shí)現(xiàn)類,主要是實(shí)現(xiàn)CloudOssService接口的:
package com.shiyi.service.impl;
import com.shiyi.common.ResponseResult;
import com.shiyi.enums.FileUploadModelEnum;
import com.shiyi.service.CloudOssService;
import com.shiyi.service.SystemConfigService;
import com.shiyi.strategy.context.FileUploadStrategyContext;
import lombok.RequiredArgsConstructor;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;
import java.util.Objects;
@Service
@RequiredArgsConstructor
public class CloudOssServiceImpl implements CloudOssService {
private final SystemConfigService systemConfigService;
private final FileUploadStrategyContext fileUploadStrategyContext;
private String strategy;
/**
* 上傳文件
* @param file
* @return
*/
@Override
public ResponseResult upload(MultipartFile file) {
if (file.getSize() > 1024 * 1024 * 10) {
return ResponseResult.error("文件大小不能大于10M");
}
//獲取文件后綴
String suffix = Objects.requireNonNull(file.getOriginalFilename()).substring(file.getOriginalFilename().lastIndexOf(".") + 1);
if (!"jpg,jpeg,gif,png".toUpperCase().contains(suffix.toUpperCase())) {
return ResponseResult.error("請(qǐng)選擇jpg,jpeg,gif,png格式的圖片");
}
getFileUploadWay();
String key = fileUploadStrategyContext.executeFileUploadStrategy(strategy, file, suffix);
return ResponseResult.success(key);
}
/**
* 刪除文件
* @param key
* @return
*/
@Override
public ResponseResult delBatchFile(String ...key) {
getFileUploadWay();
Boolean isSuccess = fileUploadStrategyContext.executeDeleteFileStrategy(strategy, key);
if (!isSuccess) {
return ResponseResult.error("刪除文件失敗");
}
return ResponseResult.success();
}
private void getFileUploadWay() {
strategy = FileUploadModelEnum.getStrategy(systemConfigService.getCustomizeOne().getFileUploadWay());
}
}最后是文件上傳策略上下文類:
package com.shiyi.strategy.context;
import com.shiyi.strategy.FileUploadStrategy;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;
import java.util.Map;
/**
* @apiNote 文件上傳策略上下文
*/
@Service
@RequiredArgsConstructor
public class FileUploadStrategyContext {
private final Map<String, FileUploadStrategy> fileUploadStrategyMap;
/**
* 執(zhí)行文件上傳策略
*
* @param file 文件對(duì)象
* @return {@link String} 文件名
*/
public String executeFileUploadStrategy(String fileUploadMode, MultipartFile file,String suffix) {
return fileUploadStrategyMap.get(fileUploadMode).fileUpload(file,suffix);
}
/**
* 刪除文件策略
* @param fileUploadMode
* @param key
* @return
*/
public Boolean executeDeleteFileStrategy(String fileUploadMode,String ...key) {
return fileUploadStrategyMap.get(fileUploadMode).deleteFile(key);
}
}QiNiuUploadStrategyImpl實(shí)現(xiàn)類的代碼:
package com.shiyi.strategy.imp;
import com.alibaba.fastjson.JSON;
import com.qiniu.common.QiniuException;
import com.qiniu.http.Response;
import com.qiniu.storage.BucketManager;
import com.qiniu.storage.Configuration;
import com.qiniu.storage.Region;
import com.qiniu.storage.UploadManager;
import com.qiniu.storage.model.BatchStatus;
import com.qiniu.storage.model.DefaultPutRet;
import com.qiniu.storage.model.FileInfo;
import com.qiniu.util.Auth;
import com.shiyi.entity.SystemConfig;
import com.shiyi.enums.QiNiuAreaEnum;
import com.shiyi.service.SystemConfigService;
import com.shiyi.strategy.FileUploadStrategy;
import com.shiyi.util.UUIDUtils;
import lombok.RequiredArgsConstructor;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;
import javax.annotation.PostConstruct;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
@Service("qiNiuUploadStrategyImpl")
@RequiredArgsConstructor
public class QiNiuUploadStrategyImpl implements FileUploadStrategy {
private final Logger logger = LoggerFactory.getLogger(QiNiuUploadStrategyImpl.class);
private final SystemConfigService systemConfigService;
private String qi_niu_accessKey;
private String qi_niu_secretKey;
private String qi_niu_bucket;
private Region region;
private String qi_niu_url;
@PostConstruct
private void init(){
SystemConfig systemConfig = systemConfigService.getCustomizeOne();
qi_niu_accessKey = systemConfig.getQiNiuAccessKey();
qi_niu_secretKey = systemConfig.getQiNiuSecretKey();
qi_niu_bucket = systemConfig.getQiNiuBucket();
qi_niu_url = systemConfig.getQiNiuPictureBaseUrl();
region = QiNiuAreaEnum.getRegion(systemConfig.getQiNiuArea());
}
public void list() {
Configuration configuration = new Configuration(region);
Auth auth = Auth.create(qi_niu_accessKey, qi_niu_secretKey);
BucketManager bucketManager = new BucketManager(auth,configuration);
BucketManager.FileListIterator fileListIterator = bucketManager.createFileListIterator(qi_niu_bucket, null, 1000, null);
while (fileListIterator.hasNext()) {
FileInfo[] next = fileListIterator.next();
for (FileInfo fileInfo : next) {
logger.info("文件打印開始,文件名:{}",qi_niu_url + fileInfo.key);
logger.info("文件類別打印開始,類別:{}",fileInfo.mimeType);
logger.info("文件大小打印開始,大小:{}",fileInfo.fsize);
}
}
}
/**
* 七牛云文件上傳
* @param file 文件
* @param suffix 后綴
* @return
*/
@Override
public String fileUpload(MultipartFile file,String suffix) {
String key = null;
//構(gòu)造一個(gè)帶指定 Region 對(duì)象的配置類
Configuration cfg = new Configuration(region);
//...其他參數(shù)參考類注釋
UploadManager uploadManager = new UploadManager(cfg);
//...生成上傳憑證,然后準(zhǔn)備上傳
Auth auth = Auth.create(qi_niu_accessKey, qi_niu_secretKey);
String upToken = auth.uploadToken(qi_niu_bucket);
InputStream inputStream = null;
try {
inputStream = file.getInputStream();
//這里需要處理一下,不能讓每次上去都是個(gè)UUID的文件名
Response response = uploadManager.put(inputStream, "blog/"+UUIDUtils.getUuid() + "." + suffix, upToken,null,null);
//解析上傳成功的結(jié)果
DefaultPutRet putRet = JSON.parseObject(response.bodyString(),DefaultPutRet.class);
key = qi_niu_url + putRet.key;
} catch (QiniuException ex) {
Response r = ex.response;
logger.error("QiniuException:{}",r.toString());
} catch (IOException e) {
e.printStackTrace();
}finally {
if (inputStream != null){
try {
inputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
return key;
}
/**
* 批量刪除文件
* @return
*/
@Override
public Boolean deleteFile(String ...keys) {
//構(gòu)造一個(gè)帶指定 Region 對(duì)象的配置類
Configuration cfg = new Configuration(Region.region2());
//...其他參數(shù)參考類注釋
Auth auth = Auth.create(qi_niu_accessKey, qi_niu_secretKey);
BucketManager bucketManager = new BucketManager(auth, cfg);
try {
BucketManager.BatchOperations batchOperations = new BucketManager.BatchOperations();
batchOperations.addDeleteOp(qi_niu_bucket, keys);
Response response = bucketManager.batch(batchOperations);
BatchStatus[] batchStatusList = response.jsonToObject(BatchStatus[].class);
for (int i = 0; i < keys.length; i++) {
BatchStatus status = batchStatusList[i];
String key = keys[i];
System.out.print(key + "\t");
if (status.code == 200) {
System.out.println("delete success");
} else {
System.out.println(status.data.error);
}
}
return true;
} catch (QiniuException ex) {
System.err.println(ex.response.toString());
return false;
}
}
}然后我們從接口里面直接調(diào)用即可上傳上去。

到此這篇關(guān)于Java實(shí)現(xiàn)上傳網(wǎng)絡(luò)圖片到七牛云存儲(chǔ)詳解的文章就介紹到這了,更多相關(guān)Java上傳圖片到七牛云存儲(chǔ)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
SpringBoot基于數(shù)據(jù)庫(kù)的定時(shí)任務(wù)統(tǒng)一管理的實(shí)現(xiàn)
這篇文章主要介紹了SpringBoot基于數(shù)據(jù)庫(kù)的定時(shí)任務(wù)統(tǒng)一管理的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-12-12
SpringBoot上傳圖片到指定位置并返回URL的實(shí)現(xiàn)
本文主要介紹了SpringBoot上傳圖片到指定位置并返回URL,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下<BR>2022-03-03
Mybatis-Plus如何使用分頁(yè)實(shí)例詳解
最近在研究mybatis,然后就去找簡(jiǎn)化mybatis開發(fā)的工具,下面這篇文章主要給大家介紹了關(guān)于Mybatis-Plus如何使用分頁(yè)的相關(guān)資料,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-03-03
Java?springBoot初步使用websocket的代碼示例
這篇文章主要介紹了Java?springBoot初步使用websocket的相關(guān)資料,WebSocket是一種實(shí)現(xiàn)實(shí)時(shí)雙向通信的協(xié)議,適用于需要實(shí)時(shí)通信的應(yīng)用程序,文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下2025-03-03
java創(chuàng)建excel示例(jxl使用方法)
Java Excel是一開放源碼項(xiàng)目,通過(guò)它Java開發(fā)人員可以讀取Excel文件的內(nèi)容、創(chuàng)建新的Excel文件、更新 已經(jīng)存在的Excel文件。下面是使用方法,包括去掉網(wǎng)格線、字體設(shè)置、單元格設(shè)置、對(duì)齊方式等設(shè)置2014-03-03

