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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > windows >内容正文

windows

js上传多个文件到asp.net core,并实时转存到阿里云oss

發布時間:2023/12/24 windows 34 coder
生活随笔 收集整理的這篇文章主要介紹了 js上传多个文件到asp.net core,并实时转存到阿里云oss 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

有時候,為了追求便利性,我們可能會讓前端直接將文件上傳到阿里云OSS,然后將URL提交給ASP.NET。然而,這種做法意味著前端需要擁有OSS的訪問密鑰,而將密鑰存放在前端,無疑增加了被破解的風險。因此,最安全的做法仍然是由服務器端負責上傳文件到OSS。

接下來,我將演示如何實現分塊上傳到服務器的過程,而且在這個過程中,服務器并不保存任何分塊,而是直接將分塊上傳到OSS。

服務器端


asp.net 引用 nuget 包:
JMS.FileUploader.AspNetCore
Aliyun.OSS.SDK.NetCore

實現一個oss的 IUploadFilter , 把接收到的分塊數據,實時傳到oss

    [UploadFilterDescription("Aliyun")]
    public class AliyunUploadFilter : IUploadFilter
    {
        const string BucketName = "<your-bucket-name>";
		const string OssEndpoint = "<your-oss-endpoint>";
		const string AccessKeyId = "<your-accessKeyId>";
		const string AccessKeySecret = "<your-accessKeySecret>";

        string _uploadId;
        string _ossUploadId;
        
        string _objectKey;
        OssClient _ossClient;
        public async Task OnUploadBeginAsync(HttpContext context, string uploadId, string fileName, long fileSize, int fileItemIndex)
        {
            _uploadId = uploadId;

            _objectKey = $"file{fileItemIndex}.zip";

            _ossClient = new OssClient(OssEndpoint , AccessKeyId , AccessKeySecret );

            var ret = _ossClient.InitiateMultipartUpload(new InitiateMultipartUploadRequest(BucketName, _objectKey));
            if (ret.HttpStatusCode != System.Net.HttpStatusCode.OK)
                throw new Exception(ret.HttpStatusCode.ToString());

            _ossUploadId = ret.UploadId;
        }

        public async Task OnReceivedAsync(HttpContext context, Stream inputStream, long position, int size)
        {

            var data = new byte[size];
            await inputStream.ReadAtLeastAsync(data, size);

            using var ms = new MemoryStream(data);

         
            var num = (int)(position / 102400) + 1;
            var ret = _ossClient.UploadPart(new UploadPartRequest(BucketName, _objectKey, _ossUploadId) { 
                InputStream = ms,
                
                PartSize = size,
                PartNumber = num
            });

            if (ret.HttpStatusCode != System.Net.HttpStatusCode.OK)
                throw new Exception(ret.HttpStatusCode.ToString());
        }


        public async Task<string> OnUploadCompletedAsync(HttpContext context)
        {

            for (int i = 0; i < 3; i++) // 如果發生錯誤,最多嘗試3次
            {
                try
                {
                    // 列出所有分塊。
                    var listPartsRequest = new ListPartsRequest(BucketName, _objectKey, _ossUploadId);
                    var partList = _ossClient.ListParts(listPartsRequest);

                    // 創建CompleteMultipartUploadRequest對象。
                    var completeRequest = new CompleteMultipartUploadRequest(BucketName, _objectKey, _ossUploadId);

                    // 設置分塊列表。
                    foreach (var part in partList.Parts)
                    {
                        completeRequest.PartETags.Add(new PartETag(part.PartNumber, part.ETag));
                    }

                    // 完成上傳。
                    var ret = _ossClient.CompleteMultipartUpload(completeRequest);


                    if (ret.HttpStatusCode != System.Net.HttpStatusCode.OK)
                        throw new Exception(ret.HttpStatusCode.ToString());

                    //設置訪問權限
                    _ossClient.SetObjectAcl(BucketName, _objectKey, CannedAccessControlList.PublicRead);

                    //返回下載的url路徑
                    return ret.Location;
                }
                catch (Exception)
                {
                    if (i == 2)
                    {
                        throw;
                    }
                    else
                    {
                        Thread.Sleep(3000);
                    }
                }
            }
            return null;
        }

        public void OnUploadError()
        {
           
        }

    }

然后注冊這個 filter :

services.AddFileUploadFilter<AliyunUploadFilter>();

啟用上傳組件:

app.UseJmsFileUploader();

controller里面寫一個最終的業務處理函數

    [ApiController]
    [Route("[controller]/[action]")]
    public class MainController : ControllerBase
    {

        [HttpPost]
        public string Test([FromBody] object body)
        {
            var customHeader = Request.Headers["Custom-Header"];

            //臨時文件路徑
            var filepath = Request.Headers["FilePath"];

            //文件名
            var filename = Request.Headers["Name"];
            return filepath + "\r\n" + filename + "\r\n" + customHeader;
        }
    }

前端


前端 import 模塊:jms-uploader

    async function uploadToAliyun() {
        //自定義請求頭
        var headers = function () {
            return { "Custom-Header": "test" };
        };

        //提交的body
        var dataBody = {
            name: "abc"
        };

        var uploader = new JmsUploader("http://localhost:5200/Main/Test", [document.querySelector("#file1").files, document.querySelector("#file2").files], headers, dataBody);

        uploader.setPartSize(1024*300);//設置分塊大小300K
        uploader.setUploadFilter("Aliyun");//設置服務器使用哪個upload filter

        uploader.onUploading = function (percent, uploadedSize, totalSize) {
            document.querySelector("#info").innerHTML = percent + "% " + uploadedSize + "," + totalSize;
        };

        try {
            var ret = await uploader.upload();
            alert(ret);
        } catch (e) {
            alert("錯誤:" + JSON.stringify(e));
        }
    }

html

<body>
    <input id="file1" multiple type="file" />
    <input id="file2" multiple type="file" />
    <button onclick="uploadToAliyun()">
        upload to aliyun oss
    </button>
    <div id="info"></div>
</body>

總結

以上是生活随笔為你收集整理的js上传多个文件到asp.net core,并实时转存到阿里云oss的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。