IDEA阿里云OSS實現文件上傳·解決蒼穹外賣圖片回顯

簡單交代配置阿里云OSS的思路

1. 首先去阿里云開通一個OSS服務,配置好一個自己的Bucket

2. 在IDEA配置Bucket

3. 拷貝官網的OSS工具類代碼

package com.sky.utils;import com.aliyun.oss.ClientException;
import com.aliyun.oss.OSS;
import com.aliyun.oss.OSSClientBuilder;
import com.aliyun.oss.OSSException;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.extern.slf4j.Slf4j;
import java.io.ByteArrayInputStream;@Data
@AllArgsConstructor
@Slf4j
public class AliOssUtil {private String endpoint;private String accessKeyId;private String accessKeySecret;private String bucketName;/*** 文件上傳** @param bytes* @param objectName* @return*/public String upload(byte[] bytes, String objectName) {// 創建OSSClient實例。OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);try {// 創建PutObject請求。ossClient.putObject(bucketName, objectName, new ByteArrayInputStream(bytes));} catch (OSSException oe) {System.out.println("Caught an OSSException, which means your request made it to OSS, "+ "but was rejected with an error response for some reason.");System.out.println("Error Message:" + oe.getErrorMessage());System.out.println("Error Code:" + oe.getErrorCode());System.out.println("Request ID:" + oe.getRequestId());System.out.println("Host ID:" + oe.getHostId());} catch (ClientException ce) {System.out.println("Caught an ClientException, which means the client encountered "+ "a serious internal problem while trying to communicate with OSS, "+ "such as not being able to access the network.");System.out.println("Error Message:" + ce.getMessage());} finally {if (ossClient != null) {ossClient.shutdown();}}//文件訪問路徑規則 https://BucketName.Endpoint/ObjectNameStringBuilder stringBuilder = new StringBuilder("https://");stringBuilder.append(bucketName).append(".").append(endpoint).append("/").append(objectName);log.info("文件上傳到:{}", stringBuilder.toString());return stringBuilder.toString();}
}

4. OSS工具類對象的創建

package com.sky.config;import com.sky.properties.AliOssProperties;
import com.sky.utils.AliOssUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;/*** 配置類,用于創建AliOssUtil對象*/
@Configuration
@Slf4j
public class OssConfiguration {// 通過參數注入的方式,將Oss的配置信息傳遞進來// Bean 如果容器中沒有AliOssUtil對象,則創建AliOssUtil對象// ConditionalOnBean 表示如果容器中存在AliOssUtil對象,則不創建AliOssUtil對象@Bean@ConditionalOnMissingBeanpublic AliOssUtil aliOssUtil(AliOssProperties aliOssProperties) {log.info("開始創建阿里云文件上傳工具類對象:{}",aliOssProperties);// 創建AliOssUtil對象,并傳入配置信息return new AliOssUtil(aliOssProperties.getEndpoint(),aliOssProperties.getAccessKeyId(),aliOssProperties.getAccessKeySecret(),aliOssProperties.getBucketName());}
}

5. 在Controller層編寫文件上傳邏輯

// Autowired注解的作用:自動將匹配的Bean裝配到@Autowired標注的變量、方法或構造函數上。(依賴注入)@Autowiredprivate AliOssUtil aliOssUtil;/*** 文件上傳* @param file* @return*/@PostMapping("/upload")@ApiOperation("文件上傳")public Result<String> upload(MultipartFile file) {log.info("文件上傳接口被調用:{}",file);String filePath = null;try {//  獲取原始文件名String originalFilename = file.getOriginalFilename();// 截取原始文件名的擴展名String extName = originalFilename.substring(originalFilename.lastIndexOf("."));// 生成新的文件名: UUID + 擴展名String newFileName = UUID.randomUUID().toString() + extName;// 文件上傳請求路徑filePath = aliOssUtil.upload(file.getBytes(), newFileName);}catch(IOException e){e.printStackTrace();log.error("文件上傳失敗:{}",e);return Result.error(MessageConstant.UPLOAD_FAILED);}return Result.success(filePath);}

6. 測試(省略,做到這里基本無誤了)

接下來就來講講文件回顯失敗的幾點調試方向

文件回顯失敗的原因及其排查方向

1. 檢查你文件上傳拼接的url是否正確

這一步如果錯了,實際上上傳就已經錯了,更別提回顯這方面的事情了

2. 首先,如果你全程跟著蒼穹老師寫的代碼去做,必然會導致文件回顯失敗,我記得視頻里面的代碼最后是沒有返回文件上傳路徑的,你可以改一下再嘗試

具體的,蒼穹老師寫的文件上傳代碼:

問題就出在成功的時候還封裝了錯誤的信息進行返回,你應該要把錯誤的返回放到catch中,成功后把文件路徑放到Result中

/*** 文件上傳* @param file* @return*/@PostMapping("/upload")@ApiOperation("文件上傳")public Result<String> upload(MultipartFile file) {log.info("文件上傳接口被調用:{}",file);try {//  獲取原始文件名String originalFilename = file.getOriginalFilename();// 截取原始文件名的擴展名String extName = originalFilename.substring(originalFilename.lastIndexOf("."));// 生成新的文件名: UUID + 擴展名String newFileName = UUID.randomUUID().toString() + extName;// 文件上傳請求路徑String filePath  = aliOssUtil.upload(file.getBytes(), newFileName);}catch(IOException e){e.printStackTrace();log.error("文件上傳失敗:{}",e);}return Result.error(MessageConstant.UPLOAD_FAILED);}
3. 接著排查OSS,你得允許你的網頁可以訪問你的OSS對象存儲服務之后才可以拿到文件的訪問路徑,使用OSS必須設置公共讀屬性

由于我只是練習程序,不想麻煩所以直接設置了公共讀寫。但是其實最安全的方式還是配置一個防盜鏈放行你的網頁會比較安全

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/43788.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/43788.shtml
英文地址,請注明出處:http://en.pswp.cn/web/43788.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

同三維T80001編碼器(帶屏)系列視頻使用操作說明書:高清HDMI編碼器,高清SDI編碼器,4K超清HDMI編碼器,雙路4K超高清編碼器

同三維T80001編碼器&#xff08;帶屏&#xff09;系列視頻使用操作說明書&#xff1a;高清HDMI編碼器&#xff0c;高清SDI編碼器&#xff0c;4K超清HDMI編碼器&#xff0c;雙路4K超高清編碼器 同三維T80001編碼器&#xff08;帶屏&#xff09;系列視頻使用操作說明書&#xff1…

【C語言】printf、fprintf、sprintf,scanf、fscanf、sscanf的區別

目錄 前言 printf、fprintf、sprintf printf fprintf sprintf scanf、fscanf、sscanf scanf fscanf sscanf 前言 這幾個函數曾出現在面試中&#xff0c;因為函數名都差不多&#xff0c;所以很讓人迷惑啊~ 下面我們逐個分析。 printf、fprintf、sprintf 這三個函數的主…

子任務:IT運維的精細化管理之道

在當今的企業運營中&#xff0c;信息技術已成為支撐業務發展的核心力量。根據Gartner的報告&#xff0c;IT服務管理&#xff08;ITSM&#xff09;的有效實施可以顯著提升企業的運營效率&#xff0c;降低成本高達15%&#xff0c;同時提高服務交付速度和質量。隨著業務的復雜性和…

電腦工具箱神器——uTools

AI視頻生成&#xff1a;小說文案智能分鏡智能識別角色和場景批量Ai繪圖自動配音添加音樂一鍵合成視頻https://aitools.jurilu.com/ 很多人腦子里都有一些一個月只用兩三次的軟件&#xff0c;這些軟件就這樣積滿了灰塵&#xff0c;需要的時候又不知道去哪里找。uTools 完美地解決…

筆記:在Entity Framework Core 中,常用Attribute有哪些

一、目的&#xff1a; Entity Framework Core (EF Core) 支持使用屬性&#xff08;Attributes&#xff09;來配置模型和映射數據庫。這些屬性提供了一種聲明性的方式來指定如何將類和屬性映射到數據庫表和列。以下是一些EF Core中常用的屬性&#xff1a; 二、實現 1. [Table] …

力扣題解(環繞字符串中唯一的子字符串)

467. 環繞字符串中唯一的子字符串 定義字符串 base 為一個 "abcdefghijklmnopqrstuvwxyz" 無限環繞的字符串&#xff0c;所以 base 看起來是這樣的&#xff1a; "...zabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcd....". 給你一個字符串 s …

深入理解 MyBatis 的 SqlSession:MyBatis 核心接口全解析

MyBatis 是一個非常流行的 Java 持久層框架&#xff0c;它簡化了數據庫操作&#xff0c;并且提供了強大的映射特性。在 MyBatis 中&#xff0c;SqlSession 是與數據庫交互的核心接口。本文將詳細介紹 SqlSession 的功能和使用方法。 什么是 SqlSession&#xff1f; SqlSessio…

MYSQL審批流程判斷同一層級審批人是否全部通過審批

在做流程審批的時候&#xff0c;通常會出現某一層有多個審批人的情況&#xff0c;這個時候需要所有人都通過才會進入到下一步 數據結構如下圖表格所示 每一個審批申請對應一個apply_id serial_no相同的代表是同一層級審批人 approval_status是審核狀態 下面我們可以用一個SQL來…

Day50:單調棧 LeedCode 739. 每日溫度 496.下一個更大元素 I 503. 下一個更大元素 II

739. 每日溫度 給定一個整數數組 temperatures &#xff0c;表示每天的溫度&#xff0c;返回一個數組 answer &#xff0c;其中 answer[i] 是指對于第 i 天&#xff0c;下一個更高溫度出現在幾天后。如果氣溫在這之后都不會升高&#xff0c;請在該位置用 0 來代替。 示例 1: 輸…

【蓄勢·致遠】 同為科技(TOWE)2024年年中會議

2024年7月2日-8日&#xff0c;同為科技&#xff08;TOWE&#xff09;召開2024年年中工作會議。會議回顧上半年總體工作情況&#xff0c;分析研判發展形勢&#xff0c;規劃部署下半年工作。 為期一周的工作會議&#xff0c;由同為科技&#xff08;TOWE&#xff09;創始人、董事長…

futures.toArray(new CompletableFuture[0])

futures.toArray(new CompletableFuture[0]) 是一種常見的將 List 轉換為數組的方式&#xff0c;特別是在需要將 List 傳遞給接受數組參數的方法時。讓我們詳細解釋一下這段代碼的具體含義和工作原理。 代碼解釋 假設 futures 是一個 List<CompletableFuture<Map<St…

【人臉識別、Python實現】PyQt5人臉識別管理系統

PyQt5人臉識別管理系統 項目描述主要功能效果展示獲取源碼 項目描述 接的一個基于宿舍管理系統與人臉識別的小單子。然后我把它優化了一些&#xff0c;現在開源一下。有需要的小伙伴自取&#xff0c;點個免費的關注就行 主要功能 1、錄入學生基本信息、錄入人臉 2、主頁面展…

【Django】Django 使用連接串配置數據庫

Django 使用連接串配置數據庫 Django 配置數據庫 修改 settings.py 中 DATABASES&#xff0c;這里以 mysql 數據庫為例。 DATABASES {default: {ENGINE: django.db.backends.mysql,NAME: your_database_name,USER: your_database_user,PASSWORD: your_database_password,HO…

深度|不同數據系統中的“一致性”(Consistency)含義的區別

“你們的系統能實現強一致性嗎&#xff1f;”作為過去幾年一直在開發流處理系統的從業者&#xff0c;我經常被問到這個問題。我時常想自信地推銷我們的產品&#xff0c;但現實情況是&#xff0c;回答這個問題并不簡單。其中的挑戰并不在于問題本身&#xff0c;而在于 “一致性”…

字節8年經驗之談!好用移動APP自動化測試框架有哪些?

移動App自動化測試框架是為了提高測試效率、降低測試成本而開發的一套工具和方法。好用的移動App自動化測試框架有很多&#xff0c;下面將介紹一些常用的框架&#xff0c;并提供一篇超詳細和規范的文章&#xff0c;從零開始幫助你搭建一個移動App自動化測試框架。 1. Appium&a…

筆記:在Entity Framework Core中使用DeleteBehavior配置外鍵級聯刪除

一、目的&#xff1a; 在Entity Framework Core中&#xff0c;DeleteBehavior枚舉定義了在刪除主實體時如何處理與之關聯的外鍵約束。DeleteBehavior.Cascade是DeleteBehavior枚舉的一個選項&#xff0c;它指定當刪除主實體時&#xff0c;所有具有外鍵引用的相關實體也將被自動…

十大優秀AI人工智能作詞軟件有哪些?

1、妙筆生詞&#xff1a;國內專業智能作詞工具&#xff0c;是一款非常優秀的國內作詞軟件&#xff0c;它可以選擇語言&#xff0c;風格&#xff0c;韻腳一鍵生成歌詞&#xff0c;也可以仿寫歌詞&#xff0c;可以續寫歌詞&#xff0c;可以智能取歌名&#xff0c;找優秀詞句&…

神經網絡識別數字圖像案例

學習資料&#xff1a;從零設計并訓練一個神經網絡&#xff0c;你就能真正理解它了_嗶哩嗶哩_bilibili 這個視頻講得相當清楚。本文是學習筆記&#xff0c;不是原創&#xff0c;圖都是從視頻上截圖的。 1. 神經網絡 2. 案例說明 具體來說&#xff0c;設計一個三層的神經網絡。…

如何找工作 校招 | 社招 | 秋招 | 春招 | 提前批

馬上又秋招了&#xff0c;作者想起以前讀書的時候&#xff0c;秋招踩了很多坑&#xff0c;但是第一份工作其實挺重要的。這里寫一篇文章&#xff0c;分享一些校招社招的心得。 現在大學的情況是&#xff0c;管就業的人&#xff0c;大都是沒有就業的輔導員&#xff08;筆者見過…

億發512版本更新,看數據駕駛艙、掃碼揀貨、UDI序列號的新功能

如果您正尋求突破傳統業務模式的束縛&#xff0c;希望擁抱數字化轉型帶來的無限可能&#xff0c;我們誠邀您體驗億發軟件。億發專業團隊將為您提供個性化的咨詢和定制服務&#xff0c;幫助您的企業快速適應市場變化&#xff0c;實現業務模式和商業模式的創新。