将大型文件上载到Xamarin中的Azure Media Services
我正在尝试将从用户的iOS或Android设备中选择的.mp4文件上载到我的Azure Media Services帐户 此代码适用于小文件(小于~95MB): 异常消息是“请求正文太大,超出了允许的最大限制。” 异常状态代码为“RequestEntityTooLarge”将大型文件上载到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
如何上传大文件?这是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();