Asp.Net Core 2 + Google Cloud Storage скачать Memory Stream - PullRequest
0 голосов
/ 25 апреля 2018

Я работаю над Asp.Net Core 2 Web Api, и мне нужно создать конечную точку для загрузки файла. Этот файл не является общедоступным, поэтому я не могу использовать свойство MediaLink объекта хранения Google. Я использую их C # библиотеку .

В фрагменте кода вы увидите ниже _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, которую я даже не могу поймать.

Я не вижу, что я делаю неправильно, возможно, как я использую поток памяти, но я не могу даже поймать ошибку.

Спасибо за любую помощь

1 Ответ

0 голосов
/ 25 апреля 2018

Вы перематываете поток, но прежде чем что-то записать в него - но вы не перематываете его потом.Я ожидаю, что это приведет к пустому ответу, а не к ошибке 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;
...