前端實現OSS上傳圖片(Vue3+vant)

首先,下面這些信息從阿里云服務器OSS管理中獲取

aliyun:oss:file:endpoint: "oss-cn-beijing.aliyuncs.com"keyid: "xxxxxxxxx"keysecret: "xxxxxxxxxxxx"bucketname: "xxxx"

一、安裝OSS

npm install ali-oss

二、以下步驟中解決引入ts校驗的,有些地方比較多余,想試試也行,直接跳過吧

在 TypeScript 中,如果你遇到“無法找到模塊 'ali-oss' 的聲明文件”的錯誤,通常是因為該模塊沒有提供類型定義文件

解決方法:

1.安裝類型定義:

如果?ali-oss?沒有提供類型定義文件,你可以嘗試安裝?@types/ali-oss,但目前可能沒有可用的類型定義。

npm install --save-dev @types/ali-oss
pnpm add -D @types/ali-oss

如果沒有這個包,你可以手動創建一個類型定義文件。

2.手動創建類型定義:

  • 在你的項目中創建一個類型定義文件,例如?src/types/ali-oss.d.ts,并添加以下內容:
declare module 'ali-oss' {export interface OSSClient {put(object: string, file: any, options?: any): Promise<any>;// 添加其他需要的方法和屬性}export default function OSS(options: {region: string;accessKeyId: string;accessKeySecret: string;bucket: string;}): OSSClient;
}
  • 更新?tsconfig.json:

    • 確保 TypeScript 配置文件 (tsconfig.json) 中包含了類型定義文件的路徑:
{"compilerOptions": {"typeRoots": ["./node_modules/@types","./src/types"  // 添加自定義類型位置]}
}

3.擴展:

使用 require:

  • 如果你不想定義類型,可以使用?require?來引入模塊,這樣 TypeScript 不會檢查類型:
const OSS = require('ali-oss');

總結:通過手動創建類型定義文件或使用?require,可以解決無法找到模塊聲明文件的問題。


擴展:

endpoint

  • oss-cn-beijing.aliyuncs.com:
    • oss:表示這是 OSS 服務。
    • cn:表示中國區域。
    • beijing:表示具體的地理區域,即北京。

其他區域示例

如果你有其他的?endpoint,可以根據以下格式進行解析:

  • 上海:?

oss-cn-shanghai.aliyuncs.com?->?region: 'cn-shanghai'

  • 廣州:?

oss-cn-guangzhou.aliyuncs.com?->?region: 'cn-guangzhou'

  • 香港:?

oss-ap-hongkong.aliyuncs.com?->?region: 'ap-hongkong'

確認區域:

如果不確定,可以在阿里云控制臺中查看你的 Bucket 的具體區域,或者查閱阿里云的官方文檔,以獲取更詳細的信息。


三、配置阿里云 OSS:

// 配置阿里云 OSS
// Bucket名稱,用于標識OSS存儲空間
const BUCKET_NAME = 'xxxxx';
// OSS的地域節點,用于訪問OSS服務的域名
const ENDPOINT = 'oss-cn-beijing.aliyuncs.com';// 創建OSS客戶端實例
const client = new OSS({region: 'oss-cn-beijing',    // 地域,例如:華北2(北京)accessKeyId: 'xxxxxxxxx',      // 訪問密鑰ID,用于身份驗證accessKeySecret: 'xxxxxxxx',  // 訪問密鑰密碼bucket: BUCKET_NAME,         // 指定操作的Bucketsecure: true,               // 使用HTTPS協議cname: false,              // 是否使用自定義域名,false表示使用阿里云默認域名
});
  • secure : 默認為 false ,表示使用 HTTP 協議。不寫的話可能會存在安全風險,建議在生產環境中設置為 true 使用 HTTPS。
  • cname : 默認為 false ,表示使用阿里云默認域名。如果不需要自定義域名,可以不寫這個配置。
  • timeout : 默認為 60000 (60秒)。如果不寫,上傳超時時間就是默認的 60 秒,對于大多數場景來說已經足夠。

Bucket 名稱:

這個一般是未公開的,所以需要再定一一個在外面,OSS里面那個刪除即可,不需要,也無法使用

  1. 在對象的外面定義:
const BUCKET_NAME = 'xxxxx'; // 定義 Bucket 名稱,這里換成你自己的

????????2.并在需要生成文件 URL 時使用該常量,ENDPOINT同理:

// 生成文件的在線鏈接const url = `https://${BUCKET_NAME}.${ENDPOINT}/${fileName}`;

ENDPOINT:

在生成 URL 時,client.options.endpoint?是用于獲取 OSS 訪問地址的一部分。然而,client.options?本身可能并不包含?endpoint?屬性。通常,endpoint?是在創建 OSS 客戶端時指定的配置選項之一,但它并不會直接暴露在?options?中。

可以在創建 OSS 客戶端時直接保存?endpoint,然后在生成 URL 時使用這個值。以下是如何實現的示例代碼:

const ENDPOINT = 'oss-cn-beijing.aliyuncs.com'; // 替換為實際 Endpoint

四、上傳文件總流程:

<script setup lang="ts">
import { ref } from 'vue';
import { showToast } from 'vant'; // 導入 Vant 的類型
import type { UploaderFileListItem } from 'vant'; // 正確導入類型
import OSS from 'ali-oss';// 聲明 fileList,類型為 UploaderFilelistItem[]
const fileList = ref<UploaderFileListItem[]>([]);// oversize 事件處理函數
const maxFileSize = 50 * 1024 * 1024; // 50MB
const onOversize = (file: File) => {if (file.size > maxFileSize) {showToast(`文件大小不能超過 ${maxFileSize / (1024 * 1024)}MB`);return false;}return true;
};
// 配置阿里云 OSS
// Bucket名稱,用于標識OSS存儲空間
const BUCKET_NAME = 'xxxxx'; // 替換成實際的
// OSS的地域節點,用于訪問OSS服務的域名
const ENDPOINT = 'oss-cn-beijing.aliyuncs.com';// 創建OSS客戶端實例
const client = new OSS({region: 'oss-cn-beijing',    // 地域,例如:華北2(北京)accessKeyId: 'xxxxxxxx',      // 訪問密鑰ID,用于身份驗證accessKeySecret: 'xxxxxxx',  // 訪問密鑰密碼bucket: BUCKET_NAME,         // 指定操作的Bucketsecure: true,               // 使用HTTPS協議cname: false,              // 是否使用自定義域名,false表示使用阿里云默認域名timeout: 60000             // 超時時間,單位:毫秒(這里設置為60秒)
});
// - secure : 默認為 false ,表示使用 HTTP 協議。不寫的話可能會存在安全風險,建議在生產環境中設置為 true 使用 HTTPS。
// - cname : 默認為 false ,表示使用阿里云默認域名。如果不需要自定義域名,可以不寫這個配置。
// - timeout : 默認為 60000 (60秒)。如果不寫,上傳超時時間就是默認的 60 秒,對于大多數場景來說已經足夠。// 上傳文件的函數
const uploadFile = async (file: File) => {try {// 生成唯一文件名,包含文件夾路徑// 獲取當前日期const timestamp = new Date();const year = timestamp.getFullYear();const month = String(timestamp.getMonth() + 1).padStart(2, '0');const day = String(timestamp.getDate()).padStart(2, '0');const randomString = Math.random().toString(36).substring(2, 8);// 指定上傳路徑let filePath: string; // 添加變量聲明// 判斷文件類型const isImage = file.type.startsWith('image/');if (isImage) {// 添加隨機字符串filePath = `png/${year}/${month}/${day}/${randomString}_${file.name}`;} else {filePath = `video/${year}/${month}/${day}/${randomString}_${file.name}`;}// 上傳文件到 OSS// client.put() 方法會將文件上傳到 OSS,其中:// - filePath 參數指定了文件在 OSS 中的存儲路徑//   - file 參數是要上傳的文件對象const result = await client.put(filePath, file);// 生成文件的在線鏈接const url = `https://${BUCKET_NAME}.${ENDPOINT}/${filePath}`;console.log('上傳成功:', result);console.log('文件在線鏈接:', url);return url;} catch (error) {console.error('上傳失敗:', error);return null; // 或者返回一個默認的錯誤鏈接}
};const handleSubmit = async () => {fileList.value.forEach(item => {// 使用類型斷言將 item.file 轉換為 File 類型const file = item.file as File;uploadFile(file)});
};// 提交文件函數
const submitFile = async () => {handleSubmit()
};</script>
<template><div><van-uploader ref="mediaUploader" v-model="fileList" multiple class="uploader-container" accept="image/*,video/*"max-count="6" @oversize="onOversize" /><button @click="submitFile">點擊上傳</button></div>
</template><style scoped>
/* 添加必要的樣式 */
</style>

上傳可能出現的問題:

  • 如果跨域,這個時候要去服務器配置允許訪問的IP地址,防止出現跨域報錯,這個是需要去官網到自己的服務器去配置的

關鍵點總結:

  • 獲取服務器相關配置信息
  • 安裝OSS
  • 使用自帶的put方法上傳圖片
const result = await client.put(filePath, file);
  • 圖片路徑就是倉庫路徑拼接的,使用put方法上傳會自動到那個倉庫路徑下去存?
  • 服務器需要配置跨域

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

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

相關文章

huggingface NLP主要知識點以及超級詳解使用

1.安裝huggingface依賴庫 pip install transformers pip install datasets pip install pytorch pip install tokenizers pip install diffusers pip install accelerate pip install evaluate pip install optimum pip install pillow pip install requests pip install gr…

Spark核心之02:常用算子詳解

1、RDD操作詳解 # 啟動spark-shell spark-shell --master local[2] 1.1 基本轉換 1) map map是對RDD中的每個元素都執行一個指定的函數來產生一個新的RDD。 任何原RDD中的元素在新RDD中都有且只有一個元素與之對應。 舉例&#xff1a; scala> val a sc.parallelize(1 …

MySQL 8.X 報錯處理

1.重新加載配置 reload the configuration mysql> ALTER INSTANCE RELOAD KEYRING; ERROR 1227 (42000): Access denied; you need (at least one of) the ENCRYPTION_KEY_ADMIN privilege(s) for this operation 提示需要ENCRYPTION_KEY_ADMIN權限 重新授權 GRANT ENCR…

SQL注入練習場:PHPStudy+SQLI-LABS靶場搭建教程(零基礎友好版)

注意&#xff1a;文中涉及演示均為模擬測試&#xff0c;切勿用于真實環境&#xff0c;任何未授權測試都是違法行為&#xff01; 一、環境準備 下載PHPStudy 官網下載地址&#xff1a;https://www.xp.cn/php-study&#xff08;選擇Windows版&#xff09; 安裝時建議選擇自定…

現今大語言模型性能(準確率)比較

現今大語言模型性能(準確率)比較 表頭信息:表的標題為“大語言模型性能比較結果”(英文:Table 1: Large Language Model Performance Comparison Results),表明該表是用于對比不同大語言模型的性能。列信息: 模型:列出參與比較的不同大語言模型名稱,包括LLAMA3(70B)…

Docker創建自定義網橋并指定網段

前言 docker0是Docker默認網絡的核心組件, 通過虛擬網橋和NAT技術, 實現了容器間的通信以及容器與外部網絡的交互。然而, docker0網段是固定的(通常是172.17.0.0/16), 為了更靈活地管理容器網絡&#xff0c;Docker支持創建自定義網橋&#xff0c;允許用戶指定網段。 例如, 在…

【向量數據庫Weaviate】 和Elasticsearch的區別

Weaviate 和 Elasticsearch 是兩種不同類型的數據庫&#xff0c;設計目標和應用場景有顯著差異。以下是它們的核心區別和適用場景的詳細對比&#xff1a; 1. 設計目標與核心能力 維度WeaviateElasticsearch核心能力向量數據庫 圖數據庫&#xff08;語義搜索優先&#xff09;全…

藍橋杯每日一題:第一周周四哞叫時間

藍橋杯每日一題&#xff1a;第一周周四哞叫時間 疑惑&#xff1a;如何把復雜度控制在Q&#xff08;n&#xff09;&#xff0c;怎么枚舉a和b&#xff0c;longlong的形式又該怎么輸入&#xff08;考慮用string&#xff09; 思路&#xff1a;枚舉倒數第二個b前面有多少個a 這是一…

在 macOS 使用 .pem 私鑰免密登錄騰訊云服務器

前言 在騰訊云上創建服務器時&#xff0c;如果選擇了「密鑰對」的登錄方式&#xff0c;就會得到一個 .pem 文件作為私鑰。很多小伙伴在使用 macOS 系統時&#xff0c;可能不清楚如何使用這個私鑰文件來 SSH 免密登錄遠程服務器。本文將詳細介紹如何在本地配置 .pem 私鑰文件并…

AI學習筆記:LM studio大模型加載參數說明

LM Studio加載大模型時參數設置頁面的常見參數及設置方法如下&#xff1a; 上下文長度&#xff08;Context Length&#xff09; 意義&#xff1a;表示模型可以處理的最大上下文長度&#xff0c;即模型一次能夠考慮的輸入文本的最大token數量。較大的上下文長度能讓模型更好地…

Spring項目中常用操作記錄

List 基礎操作 創建 // 使用 ArrayList&#xff08;基于動態數組&#xff0c;適合隨機訪問&#xff09; List<String> arrayList new ArrayList<>();// 使用 LinkedList&#xff08;基于鏈表&#xff0c;適合頻繁插入/刪除&#xff09; List<Integer> li…

騰訊 TDF 即將開源 Kuikly 跨端框架,Kotlin 支持全平臺

今天&#xff0c;在騰訊的 Shiply 平臺看 Flutter 動態化自研框架 Conch 時&#xff0c;在側邊欄看到了有「跨端開發框架」的介紹&#xff0c;點開發現有兩個產品&#xff1a; Hippy&#xff1a;面向前端技術棧的跨端開發框架&#xff0c;Web原生開發體驗&#xff0c;支持 Rea…

SQL AND OR 操作符詳解

SQL AND & OR 操作符詳解 在SQL(結構化查詢語言)中,AND 和 OR 是兩種非常重要的邏輯操作符,它們用于在查詢條件中組合多個條件。理解并正確使用這些操作符對于編寫有效的SQL查詢至關重要。 引言 在處理數據庫查詢時,我們常常需要根據多個條件來篩選數據。AND 和 OR…

nginx accesslog 打印自定義header

比如我在請求的header中添加了一個path-match-type&#xff0c;那我現在nginx的accesslog 中打印出來&#xff0c;應該如何配置呢&#xff1f; rootnginx-59f5d66df6-jw5k8:/# cat /etc/nginx/nginx.conf user nginx; worker_processes auto;error_log /var/log/nginx/erro…

響應式布局的設計規范

響應式設計&#xff08;Responsive Design&#xff09; 是一種 web 設計技術&#xff0c;旨在使網頁在不同的設備和屏幕尺寸上都有良好的顯示效果。響應式設計的核心思想是網頁的布局能夠根據設備的屏幕寬度、分辨率以及其他特性自動調整&#xff0c;使其適應桌面、平板和手機等…

說一下redis事務底層原理

Redis事務 1. 事務的基本流程 Redis 事務通過 MULTI、EXEC、WATCH 等命令實現&#xff0c;底層原理可以分為以下幾個步驟&#xff1a; (1) MULTI 命令 當客戶端發送 MULTI 命令時&#xff0c;Redis 會將客戶端標記為“事務模式”。在事務模式下&#xff0c;客戶端發送的所有…

【我的Android進階之旅】如何使用NanoHttpd在Android端快速部署一個HTTP服務器?

文章目錄 開篇:程序員的"摸魚神器"?一、為什么選擇NanoHttpd?二、五分鐘極速上車指南2.1 ? 第一步:引入依賴的哲學2.2 ? 第二步:創建服務器類:繼承大法好2.3 ? 第三步:啟動服務的儀式感三、高級玩法:讓服務器不再單調3.1 ?? 場景1:變身文件服務器3.2 ?…

播放器系列3——解碼

FFmpeg解碼過程詳解 解碼流程 #mermaid-svg-FGu92IEtteOdO2tO {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-FGu92IEtteOdO2tO .error-icon{fill:#552222;}#mermaid-svg-FGu92IEtteOdO2tO .error-text{fill:#5522…

SimPO算法-Simple Preference Optimizationwith a Reference-Free Reward

偏好優化&#xff08;preference optimization &#xff09;算法大全&#xff1a; 本篇介紹下SimPO SimPO&#xff08;Simple Preference Optimization&#xff09;的設計核心在于簡化偏好優化過程&#xff0c;同時提升模型的表現。其設計主要圍繞兩個關鍵點展開&#xff1a;長…

AIGC時代:如何快速搞定Spring Boot+Vue全棧開發

文章目錄 一、Spring Boot基礎二、Vue.js基礎三、Spring Boot與Vue.js集成四、性能優化與最佳實踐《快速搞定Spring BootVue全棧開發》 內容簡介作者簡介目錄前言/序言本書內容本書特點讀者對象 隨著人工智能生成內容&#xff08;AIGC&#xff09;技術的迅速發展&#xff0c;…