如何使用 ASP.NET 和基于 .NET 的控制器将 260kb 的 PDF 文件上传到 Azure Blob 存储?
How do you upload 260kb PDF file to Azure Blob Storage using ASP.NET and .NET based Controller?
我目前正在尝试使用 Swagger UI 上传大小为 260kb 的 pdf 文件,但它不起作用。如果我尝试用一个 50kb 的小 Word 文件做同样的事情,它就可以了。
我的控制器代码是:
[HttpPost()]
public async Task<IActionResult> Upload(IFormFile file)
{
var name = SanitizeFilename(file.FileName);
if (String.IsNullOrWhiteSpace(name))
{
throw new ArgumentException();
}
using (Stream stream = file.OpenReadStream())
{
await storage.Save(stream, name);
}
return Accepted();
}
我的 AzureBlobStorage class 的保存方法是:
public async Task<Task> Save(Stream fileStream, string name)
{
var blobContainer = await GetBlobContainerAsync();
CloudBlockBlob blockBlob = blobContainer.GetBlockBlobReference(name);
var task = blockBlob.UploadFromStreamAsync(fileStream);
var success = task.IsCompletedSuccessfully;
return task;
//return blockBlob.UploadFromStreamAsync(fileStream);
}
这是一些调试 windows:
- 此为word文档控制器:
- 这是来自PDF文档的控制者:
注意 red/pink 不同的字母。
- 这是来自AzureBlobStorage的保存方法-word文档:
- 这是来自AzureBlobStorage的保存方法-pdf文档:
我已阅读 IFormFile 可能无法进行连续流式传输,但我如何知道这是否是问题所在?如果是,首选方法是什么?
我没有遵循你的逻辑:
public async Task<Task> Save(Stream fileStream, string name)
{
var blobContainer = await GetBlobContainerAsync();
CloudBlockBlob blockBlob = blobContainer.GetBlockBlobReference(name);
var task = blockBlob.UploadFromStreamAsync(fileStream);
var success = task.IsCompletedSuccessfully;
return task;
//return blockBlob.UploadFromStreamAsync(fileStream);
}
应该这样写:
public async Task Save(Stream fileStream, string name)
{
var blobContainer = await GetBlobContainerAsync();
CloudBlockBlob blockBlob = blobContainer.GetBlockBlobReference(name);
await blockBlob.UploadFromStreamAsync(fileStream);
}
您想在这里等待任务在您 return 之前完成。
返回 Task<Task>
有点不合常理,对于您想在此处执行的操作没有意义。
另外,请记住,如果您的文件非常大,Kestrel 服务器可能会放弃请求。完成请求有大约 90 秒范围内的超时。因此,如果上传文件的时间超过 90 秒,调用方可能会收到错误消息(但上传仍会完成)。
通常您会将文件转储到磁盘,然后 return 一个 Accepted
给调用者。然后post将文件上传到后台队列中上传文件。关于 here 的更多信息。
我目前正在尝试使用 Swagger UI 上传大小为 260kb 的 pdf 文件,但它不起作用。如果我尝试用一个 50kb 的小 Word 文件做同样的事情,它就可以了。
我的控制器代码是:
[HttpPost()]
public async Task<IActionResult> Upload(IFormFile file)
{
var name = SanitizeFilename(file.FileName);
if (String.IsNullOrWhiteSpace(name))
{
throw new ArgumentException();
}
using (Stream stream = file.OpenReadStream())
{
await storage.Save(stream, name);
}
return Accepted();
}
我的 AzureBlobStorage class 的保存方法是:
public async Task<Task> Save(Stream fileStream, string name)
{
var blobContainer = await GetBlobContainerAsync();
CloudBlockBlob blockBlob = blobContainer.GetBlockBlobReference(name);
var task = blockBlob.UploadFromStreamAsync(fileStream);
var success = task.IsCompletedSuccessfully;
return task;
//return blockBlob.UploadFromStreamAsync(fileStream);
}
这是一些调试 windows:
- 此为word文档控制器:
- 这是来自PDF文档的控制者:
注意 red/pink 不同的字母。
- 这是来自AzureBlobStorage的保存方法-word文档:
- 这是来自AzureBlobStorage的保存方法-pdf文档:
我已阅读 IFormFile 可能无法进行连续流式传输,但我如何知道这是否是问题所在?如果是,首选方法是什么?
我没有遵循你的逻辑:
public async Task<Task> Save(Stream fileStream, string name)
{
var blobContainer = await GetBlobContainerAsync();
CloudBlockBlob blockBlob = blobContainer.GetBlockBlobReference(name);
var task = blockBlob.UploadFromStreamAsync(fileStream);
var success = task.IsCompletedSuccessfully;
return task;
//return blockBlob.UploadFromStreamAsync(fileStream);
}
应该这样写:
public async Task Save(Stream fileStream, string name)
{
var blobContainer = await GetBlobContainerAsync();
CloudBlockBlob blockBlob = blobContainer.GetBlockBlobReference(name);
await blockBlob.UploadFromStreamAsync(fileStream);
}
您想在这里等待任务在您 return 之前完成。
返回 Task<Task>
有点不合常理,对于您想在此处执行的操作没有意义。
另外,请记住,如果您的文件非常大,Kestrel 服务器可能会放弃请求。完成请求有大约 90 秒范围内的超时。因此,如果上传文件的时间超过 90 秒,调用方可能会收到错误消息(但上传仍会完成)。
通常您会将文件转储到磁盘,然后 return 一个 Accepted
给调用者。然后post将文件上传到后台队列中上传文件。关于 here 的更多信息。