【原創】使用阿里云存放一個臨時共享的文件

在某些場合,需要臨時將一個文件存儲到一個可被公網訪問的地方,某個服務需要訪問一下這個文件。這個文件基本上就是一次壽命,也就是你上傳一下,然后被訪問一下,這個文件的壽命就結束了。

對于這種需求,自建服務程序,太麻煩。剛好,阿里云提供了這樣的服務。其實就三個步驟:
1、創建一個臨時存放的位置
2、上傳文件
3、獲取這個臨時存放的位置對應的公網URL
然后將這個URL提供給某個服務就可以了 ,文件大約保存1個小時。那么這個文件的有效期也就是一個小時,基本上夠用了。

接下來,按照如下編碼,即可使用此功能。

獲取臨時文件上傳地址


private static Client CreateHbrClient()
{return new Client(new Config{AccessKeyId = Environment.GetEnvironmentVariable("ALIBABA_CLOUD_ACCESS_KEY_ID"),AccessKeySecret = Environment.GetEnvironmentVariable("ALIBABA_CLOUD_ACCESS_KEY_SECRET"),Endpoint = "hbr.cn-hangzhou.aliyuncs.com"});
}private static CreateTempFileUploadUrlResponse? UploadFileToTempStorage(string filePath){Client client = CreateHbrClient();try{return client.CreateTempFileUploadUrlWithOptions(new CreateTempFileUploadUrlRequest{FileName = Path.GetFileName(filePath)},new RuntimeOptions());}catch (Exception error){Console.WriteLine(error.Message);Console.WriteLine(error.Data["Recommend"]);}return null;}

上載臨時文件

正在實現C#代碼(這里試了很多次(HttpClient、WebClient),都沒搞定,最后用最原始的方式組裝數據才能用)。但是Python代碼不會遇到問題。

 public static void PostFile1(string filePath, CreateTempFileUploadUrlResponse data){//提交文件Console.WriteLine("curl -X POST ^");Console.WriteLine("-F \"OSSAccessKeyId=" + data.Body.OssAccessKeyId + "\" ^");Console.WriteLine("-F \"Signature=" + data.Body.Signature + "\" ^");Console.WriteLine("-F \"Policy=" + data.Body.Policy + "\" ^");Console.WriteLine("-F \"key=" + data.Body.TempFileKey + "\" ^");Console.WriteLine("-F \"file=@" + filePath + "\" ^");Console.WriteLine($"https://{data.Body.BucketName}.{data.Body.Endpoint}/");Console.WriteLine("");Console.ReadLine();}public static void PostFileAsync(string filePath, CreateTempFileUploadUrlResponse data){//PostFile1(filePath, data);var uploadUrl = $"https://{data.Body.BucketName}.{data.Body.Endpoint}/";string host = $"{data.Body.BucketName}.{data.Body.Endpoint}";string boundary = "---------------------------boundary";string contentType = "multipart/form-data; boundary=" + boundary;// 構造請求頭string requestHeader = $"POST / HTTP/1.1\r\n";requestHeader += $"Host: {host}\r\n";requestHeader += $"Content-Type: {contentType}\r\n";requestHeader += "Connection: close\r\n";// 構造請求體StringBuilder requestBody = new StringBuilder();requestBody.AppendLine($"--{boundary}");requestBody.AppendLine("Content-Disposition: form-data; name=\"OSSAccessKeyId\"");requestBody.AppendLine();requestBody.AppendLine(data.Body.OssAccessKeyId);requestBody.AppendLine($"--{boundary}");requestBody.AppendLine("Content-Disposition: form-data; name=\"Signature\"");requestBody.AppendLine();requestBody.AppendLine(data.Body.Signature);requestBody.AppendLine($"--{boundary}");requestBody.AppendLine("Content-Disposition: form-data; name=\"Policy\"");requestBody.AppendLine();requestBody.AppendLine(data.Body.Policy);requestBody.AppendLine($"--{boundary}");requestBody.AppendLine("Content-Disposition: form-data; name=\"key\"");requestBody.AppendLine();requestBody.AppendLine(data.Body.TempFileKey);requestBody.AppendLine($"--{boundary}");requestBody.AppendLine("Content-Disposition: form-data; name=\"file\"; filename=\"" + Path.GetFileName(filePath) + "\"");requestBody.AppendLine("Content-Type: audio/m4a");requestBody.AppendLine();byte[] requestBodyBytes = Encoding.UTF8.GetBytes(requestBody.ToString());// 讀取文件內容byte[] fileBytes = File.ReadAllBytes(filePath);// 構造完整的請求數據byte[] requestBytes = new byte[requestBodyBytes.Length + fileBytes.Length + Encoding.UTF8.GetBytes($"\r\n--{boundary}--\r\n").Length];requestBodyBytes.CopyTo(requestBytes, 0);fileBytes.CopyTo(requestBytes, requestBodyBytes.Length);Encoding.UTF8.GetBytes($"\r\n--{boundary}--\r\n").CopyTo(requestBytes, requestBodyBytes.Length + fileBytes.Length);// 發送請求using (Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp)){IPAddress ipAddress = Dns.GetHostEntry(host).AddressList[0];IPEndPoint remoteEP = new IPEndPoint(ipAddress, 443);socket.Connect(remoteEP);// 使用SslStream封裝Socket連接using (SslStream sslStream = new SslStream(new NetworkStream(socket), false, (object sender, X509Certificate? certificate, X509Chain? chain, SslPolicyErrors sslPolicyErrors)=>true)){sslStream.AuthenticateAsClient(host);// 發送請求頭byte[] headerBytes = Encoding.UTF8.GetBytes(requestHeader + $"Content-Length: {requestBytes.Length}\r\n\r\n");sslStream.Write(headerBytes);// 發送請求體sslStream.Write(requestBytes);// 接收響應byte[] buffer = new byte[1024];int bytesRead;StringBuilder response = new StringBuilder();while ((bytesRead = sslStream.Read(buffer, 0, buffer.Length)) > 0){response.Append(Encoding.UTF8.GetString(buffer, 0, bytesRead));}Console.WriteLine("Response:");Console.WriteLine(response.ToString());}}}

獲取文件路徑

    public static string? GetUrl(string filePath, CreateTempFileUploadUrlResponse data){Client client = CreateHbrClient();try{return client.GetTempFileDownloadLinkWithOptions(new GetTempFileDownloadLinkRequest{TempFileKey = data.Body.TempFileKey,},new RuntimeOptions()).Body.Url;}catch (Exception error){Console.WriteLine(error.Message);Console.WriteLine(error.Data["Recommend"]);}return null;}
}

執行代碼


const string filePath = "C:\\Users\\Zmrbak\\Documents\\Camtasia\\聲線20250513-26.m4a";//獲取臨時文件上傳地址
var urlResponse = UploadFileToTempStorage(filePath);
if (urlResponse == null) return;//上載臨時文件
await PostFileAsync(filePath, urlResponse);//獲取文件路徑
var url = GetUrl(filePath, urlResponse);
Console.WriteLine(url);

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

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

相關文章

Python中列表(list)知識詳解(2)和注意事項以及應用示例

在 Python 中列表(list) 的包括其結構、常見操作(更新、添加、刪除、查找、隊列棧行為等),下面將逐一的進行講解并附相關的示例。 一、列表的基礎知識 1. 定義與特點 定義方式:用 [] 包裹的有序可變集合 …

vscode extention踩坑記

# npx vsce package --allow-missing-repository --no-dependencies #耗時且不穩定 npx vsce package --allow-missing-repository #用這行 code --install-extension $vsixFileName --force我問ai:為什么我的.vsix文件大了那么多 ai答:因為你沒有用 --n…

移動端巡檢點檢,讓設備管理更便捷高效

在企業設備管理的日常工作中,巡檢點檢是保障設備正常運行的重要環節。傳統的巡檢方式依賴紙質記錄、人工操作,效率低、易出錯,已難以滿足現代企業的管理需求。隨著技術發展,越來越多設備管理系統引入移動端功能,為設備…

laravel 中使用的pdf 擴展包 laravel-snappy(已解決中文亂碼)

Centos7 安裝 wkhtmltopdf 1、先查看系統是 32 位的還是 64 位的 uname -a2、通過 composer 安裝 wkhtmltopdf 32位: $ composer require h4cc / wkhtmltopdf-i386 0.12.x $ composer require h4cc / wkhtmltoimage-i386 0.12.x 64位: $ composer require h4cc/wkhtmltopdf-…

Rust:重新定義系統編程的安全與效率邊界

在軟件工程領域,內存安全漏洞每年造成數千億美元損失,而C/C生態中60%的漏洞源于指針誤用。正是在這樣的背景下,Rust憑借其革命性的內存安全機制異軍突起。作為一門現代系統級編程語言,Rust不僅解決了困擾開發者數十年的內存管理難…

C++學習細節回顧(匯總二)

一.初始化列表相關 1.初始化順序受申明順序影響 2.在必要時可以部分不采用初始化列表&#xff0c;避免受特性1影響 二.非類型模板參數 template< class T , size_t N 10 > 三.特化–特殊化處理 template< class T > bool less(T left , T right) { return left&…

勾選某一行的勾選框,更改當前行的顏色,ALV數據發生變化的事件

文章目錄 屏幕ALV的創建定義變量注冊事件方法定義方法實現frm_data_change 效果 屏幕 ALV的創建 DATA: g_gui_custom_container TYPE REF TO cl_gui_custom_container. DATA: g_gui_alv_grid TYPE REF TO cl_gui_alv_grid.DATA: gt_listheader TYPE slis_t_listheader, &quo…

AI-02a5a6.神經網絡-與學習相關的技巧-批量歸一化

批量歸一化 Batch Normalization 設置合適的權重初始值&#xff0c;則各層的激活值分布會有適當的廣度&#xff0c;從而可以順利的進行學習。那么&#xff0c;更進一步&#xff0c;強制性的調整激活值的分布&#xff0c;是的各層擁有適當的廣度呢&#xff1f;批量歸一化&#…

解決SQL Server SQL語句性能問題(9)——合理使用表分區

9.2. 合理使用表分區 本專欄4.1.4節中,我們對表分區相關的概念和機制等基礎理論進行了較為詳細的介紹和論述,讀者可以參考該節中內容,或者,讀者也可以參考官方或其他相關資料。與其他關系庫類似,SQL Server 2005版本中引進的真正意義上的表分區技術,絕對是解決海量數據環…

C語言學習之文件操作

經過前面的學習&#xff0c;我們已經基本掌握了如何去寫一個C語言的代碼了。但是在實際的項目中&#xff0c;我們不可能不需要文件去操作。因為如果沒有文件&#xff0c;我們寫的程序是存儲在電腦的內存中的。如果程序推出&#xff0c;內存回收數據就隨之丟失了。如果我們要對數…

2025年PMP 學習十三 第9章 項目資源管理(9.1,9.2)

2025年PMP 學習十三 第9章 項目資源管理&#xff08;9.1,9.2&#xff09; 序號過程過程組9.1規劃資源管理規劃9.2估算活動資源規劃9.3獲取資源執行9.4建設團隊執行9.5管理團隊執行9.6控制資源監控 文章目錄 2025年PMP 學習十三 第9章 項目資源管理&#xff08;9.1,9.2&#xf…

藍橋杯13屆國B 完全日期

題目描述。 如果一個日期中年月日的各位數字之和是完全平方數&#xff0c;則稱為一個完全日期。 例如&#xff1a;2021 年 6 月 5 日的各位數字之和為 20216516&#xff0c;而 16 是一個完全平方數&#xff0c;它是 4 的平方。所以 2021 年 6 月 5 日是一個完全日期。 例如&…

某某霸翻譯逆向分析[JS逆向]

聲明 本文章中所有內容僅供學習交流使用&#xff0c;不用于其他任何目的&#xff0c;不提供完整代碼&#xff0c;抓包內容、敏感網址、數據接口等均已做脫敏處理&#xff0c;嚴禁用于商業用途和非法用途&#xff0c;否則由此產生的一切后果均與作者無關&#xff01; 本文章未經…

開源Heygem本地跑AI數字人視頻教程

圖文教程&#xff1a; 點擊跳轉 視頻教程 資料包下載 點擊下載&#xff1a;

C++之fmt庫介紹和使用(1)

C之fmt庫介紹與使用(1) Author: Once Day Date: 2025年5月12日 一位熱衷于Linux學習和開發的菜鳥&#xff0c;試圖譜寫一場冒險之旅&#xff0c;也許終點只是一場白日夢… 漫漫長路&#xff0c;有人對你微笑過嘛… 全系列文章可參考專欄: 源碼分析_Once-Day的博客-CSDN博客 …

設計模式(9)——創建型模式之工廠方法

設計模式(9)——創建型模式之工廠方法 工廠方法作用結構偽代碼適用場景工廠方法 作用 工廠方法是一種創建型設計模式,其在父類中提供一個創建對象的方法,允許子類決定實例化對象的類型。 結構 產品(Product)將會對接口進行聲明。對于所有由創建者及其子類構建的對象,…

Docker 疑難雜癥解決指南:從入門到進階的全面剖析

Docker 作為容器化技術的代表&#xff0c;憑借其輕量級、可移植性和高效資源利用率&#xff0c;已成為開發、測試和部署應用的標準工具。然而&#xff0c;在實際使用中&#xff0c;用戶常常會遇到鏡像構建失敗、容器啟動異常、網絡配置問題等疑難雜癥。本文將從鏡像構建、容器生…

搶跑「中央計算+區域控制」市場,芯馳科技高端智控MCU“芯”升級

伴隨著整車EE架構的加速變革&#xff0c;中國高端車規MCU正在迎來“新格局”。 在4月23日開幕的上海國際車展期間&#xff0c;芯馳科技面向新一代AI座艙推出了X10系列芯片&#xff0c;以及面向區域控制器、電驅和動力域控、高階輔助駕駛和艙駕融合系統等的高端智控MCU產品E3系…

DeepPrep:深度學習提升神經影像預處理

DeepPrep&#xff1a;深度學習提升神經影像預處理 一、DeepPrep介紹和BIDS格式介紹 神經影像預處理的痛點&#xff1a;傳統工具&#xff08;如fMRIPrep&#xff09;在大規模數據處理時效率低下&#xff0c;臨床樣本魯棒性不足。DeepPrep通過深度學習工作流管理實現突破&#…

pytorch 數據預處理和常用工具

文章目錄 NumPyNumpy數據結構安裝和使用NumPy Matplotlib的安裝和導入安裝和導入Matplotlib繪制基礎圖畫折線圖散點圖柱狀圖圖例 數據清洗據清洗的作用Pandas進行數據清洗Pandas數據結構Series 數據結構DataFrame數據結構 Pandas數據清洗常用代碼 特征工程主成分分析線性判別分…