日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

[转载自简书] ASPNetCore上传大文件碰到的一些问题总结

發(fā)布時間:2025/3/16 编程问答 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 [转载自简书] ASPNetCore上传大文件碰到的一些问题总结 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

上傳大文件碰到不少問題,總結(jié)一下。

?

先介紹一下功能:ajax上傳文件到NetCore的web api接口,

安裝在Linux服務器的服務端通過Nginx接受到后再存到文件服務器上。

如果文件不大,這個過程沒有任何問題,如果超過幾十M甚至幾百M就碰見不少問題。

1. 超時問題(timeout)

這個和NetCore無關,是ajax請求忘記設置timeout參數(shù)值,在網(wǎng)頁端加上即可。

2. Request body too large 錯誤

Post的body大概超過30m就會報這個錯誤,完整的錯誤是Microsoft.AspNetCore.Server.Kestrel.Core.BadHttpRequestException: Request body too large
解決的方法有二種,一種是在請求的函數(shù)前加Attribute

[HttpPost("upload")] [RequestSizeLimit(100_000_000)] //最大100m左右 //[DisableRequestSizeLimit] //或者取消大小的限制 public async Task<string> UploadFiles(ModelTest test) {

還有一種方法是全局增加請求body的大小或者不限body的大小。

public static IWebHost BuildWebHost(string[] args) {var config = new ConfigurationBuilder().AddCommandLine(args).Build();return WebHost.CreateDefaultBuilder(args).UseConfiguration(config) .UseStartup<Startup>().UseKestrel(options => { //所有controller都不限制post的body大小 options.Limits.MaxRequestBodySize = null; }) .Build(); }

3. Multipart body length limit 134217728 exceeded錯誤

Post的body大概超過100多M會碰到這個錯誤,完整的錯誤信息是 System.IO.InvalidDataException: Multipart body length limit 134217728 exceeded. 。
解決的方法是在startup.cs添加代碼:

public void ConfigureServices(IServiceCollection services) { services.AddMvc(); //解決Multipart body length limit 134217728 exceeded services.Configure<FormOptions>(x => { x.ValueLengthLimit = int.MaxValue; x.MultipartBodyLengthLimit = int.MaxValue; // In case of multipart }); }

4. Nginx限制上傳大小的錯誤

通過Nginx端口映射,請求會先經(jīng)過Nginx,也需要額外再設置一個參數(shù)client_max_body_size,否則上傳大文件也會有問題

location ^~ /sample2/ {rewrite ^/sample2/(.*)$ /$1 break; proxy_pass http://localhost:5556;client_max_body_size 300m; #最大接受300m文件以內(nèi)的 }

5. 上傳七牛大文件問題

使用七牛的SDK上傳一般小文件很簡單,但是上傳大文件就需要使用分片上傳了,否則會返回錯誤-256錯誤
以下是正常上傳和分片上傳的2個函數(shù),大家可以參考

//適應一般小文件 public HttpResult uploadByte(string saveKeys, byte[] data) { Config.AutoZone(AK, bucket, false); Mac mac = new Mac(AK, SK); string saveKey = saveKeys; PutPolicy putPolicy = new PutPolicy(); // 如果需要設置為"覆蓋"上傳(如果云端已有同名文件則覆蓋),請使用 SCOPE = "BUCKET:KEY" putPolicy.Scope = bucket + ":" + saveKey; //putPolicy.Scope = bucket; // 上傳策略有效期(對應于生成的憑證的有效期) putPolicy.SetExpires(100000); string jstr = putPolicy.ToJsonString(); string token = Auth.CreateUploadToken(mac, jstr); FormUploader fu = new FormUploader(); HttpResult result = fu.UploadData(data, saveKey, token); return result; } //適用于大文件上傳 public HttpResult UploadBigFile(string saveKeys, byte[] data) { Config.AutoZone(AK, bucket, false); // 這個示例單獨使用了一個Settings類,其中包含AccessKey和SecretKey // 實際應用中,請自行設置您的AccessKey和SecretKey Mac mac = new Mac(AK, SK); // 斷點記錄文件,可以不用設置,讓SDK自動生成,如果出現(xiàn)續(xù)上傳的情況,SDK會嘗試從該文件載入斷點記錄 // 對于不同的上傳任務,請使用不同的recordFile PutPolicy putPolicy = new PutPolicy(); // 如果需要設置為"覆蓋"上傳(如果云端已有同名文件則覆蓋),請使用 SCOPE = "BUCKET:KEY" putPolicy.Scope = bucket + ":" + saveKeys; //putPolicy.Scope = bucket; // 上傳策略有效期(對應于生成的憑證的有效期) putPolicy.SetExpires(100000); string token = Auth.CreateUploadToken(mac, putPolicy.ToJsonString()); // 包含兩個參數(shù),并且都有默認值 // 參數(shù)1(bool): uploadFromCDN是否從CDN加速上傳,默認否 // 參數(shù)2(enum): chunkUnit上傳分片大小,可選值128KB,256KB,512KB,1024KB,2048KB,4096KB ResumableUploader ru = new ResumableUploader(false, ChunkUnit.U1024K); // ResumableUploader.UploadFile有多種形式,您可以根據(jù)需要來選擇 // // 最簡模式,使用默認recordFile和默認uploadProgressHandler // UploadFile(localFile,saveKey,token) // // 基本模式,使用默認uploadProgressHandler // UploadFile(localFile,saveKey,token,recordFile) // // 一般模式,使用自定義進度處理(可以監(jiān)視上傳進度) // UploadFile(localFile,saveKey,token,recordFile,uploadProgressHandler) // // 高級模式,包含上傳控制(可控制暫停/繼續(xù) 或者強制終止) // UploadFile(localFile,saveKey,token,recordFile,uploadProgressHandler,uploadController) // // 支持自定義參數(shù) //var extra = new System.Collections.Generic.Dictionary<string, string>(); //extra.Add("FileType", "UploadFromLocal"); //extra.Add("YourKey", "YourValue"); //uploadFile(...,extra,...) //最大嘗試次數(shù)(有效值1~20),在上傳過程中(如mkblk或者bput操作)如果發(fā)生錯誤,它將自動重試,如果沒有錯誤則無需重試 int maxTry = 10; // 使用默認進度處理,使用自定義上傳控制 UploadProgressHandler upph = new UploadProgressHandler(ResumableUploader.DefaultUploadProgressHandler); HttpResult result = ru.UploadData(data, saveKeys, token, upph); return result; }



轉(zhuǎn)載于:https://www.cnblogs.com/ydchw/p/10840198.html

總結(jié)

以上是生活随笔為你收集整理的[转载自简书] ASPNetCore上传大文件碰到的一些问题总结的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。