簡體   English   中英

如何在webapi上傳中獲取Multipart文件的流?

[英]How to get the stream for a Multipart file in webapi upload?

我需要使用Stream(Azure Blobstorage)上傳文件,但是無法找出如何從對象本身獲取流。 請參見下面的代碼。

我是WebAPI的新手,並使用了一些示例。 我正在獲取文件和文件數據,但這不是我上傳方法的正確類型。 因此,我需要獲取或將其轉換為正常的Stream,目前看來有點困難:)

我知道我需要以某種方式使用ReadAsStreamAsync().Result ,但是由於我得到了兩個provider.Contents,它在foreach循環中崩潰了(第一個似乎正確,第二個似乎不正確)。

 [System.Web.Http.HttpPost]
    public async Task<HttpResponseMessage> Upload()
    {
        if (!Request.Content.IsMimeMultipartContent())
        {
            this.Request.CreateResponse(HttpStatusCode.UnsupportedMediaType);
        }

        var provider = GetMultipartProvider();
        var result = await Request.Content.ReadAsMultipartAsync(provider);

        // On upload, files are given a generic name like "BodyPart_26d6abe1-3ae1-416a-9429-b35f15e6e5d5"
        // so this is how you can get the original file name
        var originalFileName = GetDeserializedFileName(result.FileData.First());

        // uploadedFileInfo object will give you some additional stuff like file length,
        // creation time, directory name, a few filesystem methods etc..
        var uploadedFileInfo = new FileInfo(result.FileData.First().LocalFileName);



        // Remove this line as well as GetFormData method if you're not
        // sending any form data with your upload request
        var fileUploadObj = GetFormData<UploadDataModel>(result);

        Stream filestream = null;

        using (Stream stream = new MemoryStream())
        {
            foreach (HttpContent content in provider.Contents)
            {
                BinaryFormatter bFormatter = new BinaryFormatter();
                bFormatter.Serialize(stream, content.ReadAsStreamAsync().Result);
                stream.Position = 0;
                filestream = stream;
            }
        }

        var storage = new StorageServices();
        storage.UploadBlob(filestream, originalFileName);**strong text**



private MultipartFormDataStreamProvider GetMultipartProvider()
    {
        var uploadFolder = "~/App_Data/Tmp/FileUploads"; // you could put this to web.config
        var root = HttpContext.Current.Server.MapPath(uploadFolder);
        Directory.CreateDirectory(root);
        return new MultipartFormDataStreamProvider(root);
    }

這與幾個月前的困境完全相同(在MultipartStreamProvider接管並自動神奇地將流保存到文件之前捕獲上傳流)。 建議是繼承該類並重寫方法……但這在我的情況下不起作用。 :((我希望將MultipartFileStreamProviderMultipartFormDataStreamProvider的功能都集成到一個MultipartStreamProvider中,而沒有自動保存的部分)。

這可能會有所幫助; 這里的一個通過網絡API開發一個寫 ,並且這種來自同一個開發商。

您好,我只是想發布我的答案,因此,如果有人遇到相同的問題,他們可以在這里自己找到解決方案。

這里

 MultipartMemoryStreamProvider stream = await this.Request.Content.ReadAsMultipartAsync();
            foreach (var st in stream.Contents)
            {
                var fileBytes = await st.ReadAsByteArrayAsync();
                string base64 = Convert.ToBase64String(fileBytes);
                var contentHeader = st.Headers;
                string filename = contentHeader.ContentDisposition.FileName.Replace("\"", "");
                string filetype = contentHeader.ContentType.MediaType;
            }    

我使用了MultipartMemoryStreamProvider,並從內容標題中獲取了所有詳細信息,例如文件名和文件類型。 希望這對某人有幫助。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM