使用C#代码上传至Azure Blob的MP4无法在浏览器播放求助
问题
我用以下C#代码把MP4视频上传到Azure Blob存储,文件能成功上传,但浏览器访问文件URL时无法播放。不过通过Azure门户上传同一个文件却能正常播放,不知道代码哪里出问题了。
public async Task<string> UploadVideoFileAsync(IFormFile file, string fileName, string containerName, IDictionary<string, string>? metadata = null) { var containerClient = _blobServiceClient.GetBlobContainerClient(containerName); try { await containerClient.CreateIfNotExistsAsync(); var blobClient = containerClient.GetBlobClient(fileName); using (Stream stream = file.OpenReadStream()) { stream.Seek(0, SeekOrigin.Begin); await blobClient.UploadAsync(stream, new BlobUploadOptions { HttpHeaders = new BlobHttpHeaders { ContentType = "video/mp4" } }); } if (metadata != null) { await blobClient.SetMetadataAsync(metadata); } return blobClient.Uri.ToString(); } catch (RequestFailedException ex) { // Handle the exception here, e.g., log or return an error message. return $"Error uploading the file: {ex.Message}"; } }
通过上述代码上传的文件无法在浏览器播放:
解决方法
出现这个问题通常是以下几个原因,对应调整代码即可:
缺失视频流式传输所需的HTTP头
浏览器播放视频需要支持范围请求(Range Requests),补充设置关键HTTP头能帮助浏览器正确识别和流式播放。修改BlobHttpHeaders部分:HttpHeaders = new BlobHttpHeaders { ContentType = "video/mp4", ContentLength = file.Length, // 显式指定文件长度 CacheControl = "public, max-age=31536000", ContentDisposition = "inline; filename=\"" + fileName + "\"" // 告知浏览器以内联方式打开 }流读取完整性问题
虽然调用了stream.Seek(0, SeekOrigin.Begin),但IFormFile.OpenReadStream()默认已从起始位置开始,额外Seek可能引发潜在问题。可以直接使用简化的上传重载,确保流完整读取:await blobClient.UploadAsync(file.OpenReadStream(), file.Length);Blob容器访问权限不足
确保Blob容器的访问级别是Blob或Container(而非Private),否则浏览器无法直接访问。可以在代码中添加权限设置:await containerClient.SetAccessPolicyAsync(PublicAccessType.Blob);
内容的提问来源于stack exchange,提问作者Reza Shirazi
相关产品推荐
相关产品推荐

