Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-core/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将大型文件上载到Xamarin中的Azure Media Services_Xamarin_Asp.net Core_Upload_Httpwebrequest_Azure Media Services - Fatal编程技术网

将大型文件上载到Xamarin中的Azure Media Services

将大型文件上载到Xamarin中的Azure Media Services,xamarin,asp.net-core,upload,httpwebrequest,azure-media-services,Xamarin,Asp.net Core,Upload,Httpwebrequest,Azure Media Services,我正在尝试将从用户的iOS或Android设备中选择的.mp4文件上载到我的Azure Media Services帐户 此代码适用于小文件(小于~95MB): 异常消息是“请求正文太大,超出了允许的最大限制。” 异常状态代码为“RequestEntityTooLarge” 如何上传大文件?这是HttpWebRequest或Azure媒体服务的问题吗?如果您使用的是新的REST API版本,Azure存储支持一个高达256MB的(也称为PutBlob API)。但是,由于您没有指定RESTAPI

我正在尝试将从用户的iOS或Android设备中选择的.mp4文件上载到我的Azure Media Services帐户

此代码适用于小文件(小于~95MB):

异常消息是“请求正文太大,超出了允许的最大限制。” 异常状态代码为“RequestEntityTooLarge”


如何上传大文件?这是HttpWebRequest或Azure媒体服务的问题吗?

如果您使用的是新的REST API版本,Azure存储支持一个高达256MB的(也称为PutBlob API)。但是,由于您没有指定RESTAPI版本,因此默认使用非常旧的版本,其中支持的一次性上载的最大大小为100MB

使用
x-ms-version:2018-03-28
头可以在一个HTTP请求中上传高达256MB的数据


如果您必须处理较大的文件,则需要使用block&commit上传。您将需要使用从源文件暂存块。每个数据块的最大容量可达100MB。然后您需要使用提交所有块。如果您不必自己处理这个逻辑,只需使用(支持Xamarin)和uploadFromFile方法。它简单且有弹性。

为什么不使用Azure SDK编写CloudBlobBlocks,它可以为您处理大部分问题?
public static async Task<string> UploadBlob(string blobContainerSasUri, string blobName, byte[] blobContent, string path)
    {
        string responseString;
        int contentLength = blobContent.Length;
        string queryString = (new Uri(blobContainerSasUri)).Query;
        string blobContainerUri = blobContainerSasUri.Split('?')[0];
        string requestUri = string.Format(System.Globalization.CultureInfo.InvariantCulture, "{0}/{1}{2}", blobContainerUri, blobName, queryString);

        HttpWebRequest request = (HttpWebRequest)WebRequest.Create(requestUri);
        request.Method = "PUT";
        request.AllowWriteStreamBuffering = false;
        request.Headers.Add("x-ms-blob-type", "BlockBlob");
        request.ContentLength = contentLength;
        request.Timeout = Int32.MaxValue;
        request.KeepAlive = true;

        int bufferLength = 1048576; //upload 1MB at time, useful for a simple progress bar.

        Stream requestStream = request.GetRequestStream();
        requestStream.WriteTimeout = Int32.MaxValue;

        ProgressViewModel progressViewModel = App.Locator.GetProgressBar(App.Locator.MainViewModel.currentModuleItemId);
        MyVideosPage myVideosPage = App.Locator.GetVideosPage(App.Locator.MainViewModel.currentModuleItemId);

        FileStream fileStream = new FileStream(path, FileMode.Open, FileAccess.Read);
        int nRead = 0;
        int currentPos = 0;
        while ((nRead = fileStream.Read(blobContent, currentPos, bufferLength)) > 0)
        {

            await requestStream.WriteAsync(blobContent, currentPos, nRead);
            currentPos += nRead;

        }
        fileStream.Close();
        requestStream.Close();

        HttpWebResponse objHttpWebResponse = null;
        try
        {
            // this is where it fails for large files
            objHttpWebResponse = (HttpWebResponse)request.GetResponse();

            Stream responseStream = objHttpWebResponse.GetResponseStream();
            StreamReader stream = new StreamReader(responseStream);

            responseString = stream.ReadToEnd();                       
        }
        catch (Exception ex)
        {
            Console.WriteLine(ex.Message);
        }
        finally
        {
            if (objHttpWebResponse != null)
                objHttpWebResponse.Close();
        }
        return responseString;
    }
(HttpWebResponse)request.GetResponse();