我正在开发一个Asp.Net Core2WebApi,我必须创建一个端点来下载文件。这个文件不是公共的,所以我不能使用google存储对象的MediaLink
属性。我在用他们的C# library。
在下面的代码中,你会看到_storageClient
是这样创建的:_storageClient = StorageClient.Create(cred);
。客户端正在工作,只是显示它是哪个类。
[HttpGet("DownloadFile/{clientId}/{fileId}")]
public async Task<IActionResult> DownloadFile([FromRoute] long fileId, long clientId)
{
// here there are a bunch of logic and permissions. Not relevant to the quest
var stream = new MemoryStream();
try
{
stream.Position = 0;
var obj = _storageClient.GetObject("bucket name here", "file.png");
_storageClient.DownloadObject(obj, stream);
var response = File(stream, obj.ContentType, "file.png"); // FileStreamResult
return response;
}
catch (Exception ex)
{
throw;
}
}
变量obj
没有问题。所有属性都按预期填充。stream
似乎已正确填充。它有长度和所有东西,但它返回一个500错误,我甚至不能捕捉到。
我看不到我做错了什么,也许我是如何使用内存流的,但我甚至不能捕捉到错误。
谢谢你的帮助
发布于 2018-04-25 23:48:29
你正在倒带流,但是在你写任何东西之前--但是你不会在之后倒带它。我预计这会导致一个空响应,而不是500错误,但我至少会在下载后将stream.Position
调用移到:
var obj = _storageClient.GetObject("bucket name here", "file.png");
_storageClient.DownloadObject(obj, stream);
stream.Position = 0;
请注意,您不需要在下载对象元数据之前获取它。您可以只使用:
_storageClient.DownloadObject("bucket name here", "file.png", stream);
stream.Position = 0;
发布于 2019-10-10 20:15:32
解决方案可以如下所示。
[HttpGet("get-file")]
public ActionResult GetFile()
{
var storageClient = ...;
byte[] buffer;
using (var memoryStream = new MemoryStream())
{
storageClient.DownloadObject("bucket name here"+"/my-file.jpg", memoryStream);
buffer = memoryStream.ToArray();
}
return File(buffer, "image/jpeg", "my-file.jpg");
}
https://stackoverflow.com/questions/50026282
复制相似问题