【问题标题】:Asp.Net Core 2 + Google Cloud Storage download Memory StreamAsp.Net Core 2 + 谷歌云存储下载内存流
【发布时间】:2018-04-25 15:38:58
【问题描述】:

我正在开发一个 Asp.Net Core 2 Web Api,我必须创建一个端点来下载文件。这个文件不是公开的,所以我不能使用谷歌存储对象的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 错误。

我看不到我做错了什么,也许我是如何使用内存流的,但我什至无法捕捉到错误。

感谢您的帮助

【问题讨论】:

    标签: c# google-cloud-storage memorystream


    【解决方案1】:

    您正在倒带流,但在您向其写入任何内容之前 - 但您不会在之后倒带它。我希望这会导致空响应而不是 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;
    

    【讨论】:

    • 另一个不相关的问题。我看到当我尝试下载大文件 (400MB) 时,它会在 15mb 处停止并给我一个网络错误。你知道为什么吗?
    • @AndréLuiz:不是随便的。我建议您提出一个更详细的新问题(例如,您是否可以在本地运行的控制台应用程序中重现此问题)。
    【解决方案2】:

    解决方案如下。

    [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");
            }
    

    【讨论】:

      猜你喜欢
      • 2013-03-17
      • 1970-01-01
      • 2021-05-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-10-12
      • 2020-09-10
      相关资源
      最近更新 更多