Как скачать огромные файлы по ссылке для скачивания на веб-сервер API? - PullRequest
0 голосов
/ 23 мая 2018

Я пишу действие веб-API.Пользователь будет звонить на веб-API с URL-адрес загрузки.Веб-API должен загрузить файл (размером более 5 ГБ) по указанной ссылке и сохранить его на локальном диске.Пользователь должен иметь возможность делать новые запросы, пока файл предыдущего запроса загружается на сервер.

В настоящее время я реализовал это следующим образом.Я хотел бы знать, есть ли лучший подход, чем этот?

public async Task Post(string fileUrl)
{
  WebClient client = new WebClient();
  //diskPath is the local path for the file to be saved
  await client.DownloadFileTaskAsync(new Uri(fileUrl), diskPath);
}

1 Ответ

0 голосов
/ 23 мая 2018

В настоящее время я реализовал это следующим образом.Я хотел бы знать, есть ли лучший подход, чем этот?

Я не вижу никаких проблем в том, что вы реализовали с точки зрения вашего клиента, должны быть в состоянии выполнять другие задачи (здесь, чтобывызывать другие API) во время загрузки.

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

, если вы делаете это таким образом, вашодин-единственный запрос будет слишком большим важным для вас, чтобы вы могли успешно ответить.Как будто ваша загрузка продолжается, и сеть выходит из строя, вся загрузка будет неудачной.

Вместо этого

  • (если у вас его еще нет), вы создаете весь контент вбайт [] (есть несколько способов сделать это)
  • разделить целый байт [] на количество кусков (с разумным размером)
  • Скачать их один за другим (или даже параллельно, если у вас естьсвобода с широкополосной связью)
  • Объедините их вместе на стороне клиента
  • И сохраните примечание, до какого порции вы уже загрузили данные (и продолжайте обновлять эту информацию с каждым ответом)

таким образом, ваш процесс загрузки будет иметь функцию Pause-Resume, и он будет масштабируемым и устойчивым к условиям сбоя (поскольку после устранения проблемы с сетью вам нужно будет загружать только оставшиеся данные)


Вы можете разделить и объединить byte[], как показано ниже здесь операции со списками легко выполнить, поэтому сначала нужно преобразовать массив в список

//Suppose your main byte[] is array
List<byte> mainInputList = array.ToList();

Теперь разделитьвсе это в несколько кусков.

//making chunks (size of 10)
    List<List<byte>> listOfChunks = new List<List<byte>>();
    List<byte> chunks = new List<byte>();
    for (int i = 0; i < mainInputList.Count; i++)
    {
        chunks.Add(array[i]);
        if (chunks.Count == 10)
        {
            listOfChunks.Add(chunks);
            chunks = new List<byte>();
        }
    }
    if (chunks.Count > 0)
        listOfChunks.Add(chunks);

Теперь объединяем их обратно.

    //Merging Chunks
    List<byte> finalByteList = new List<byte>();
    foreach(List<byte> chunk in listOfChunks)
    {
        finalByteList.AddRange(chunk);
    }
    byte[] finalByteArr = finalByteList.ToArray();

для создания байта [], формирующего любой объект и создания объекта из байта []:

Как преобразовать байтовый массив в любой тип


Обновление

Цитирование важного вопроса, который поднимается в разделе комментариев.

Имейте в виду:

Если вам нужны чанки для загрузки, они, очевидно, имеют такой большой размер, что я бы не хотел хранить их в памяти, если они, наконец, будут записаны на дисктем не мение.Просто для каждого фрагмента (который должен иметь фиксированный или, по крайней мере, максимальный размер), который вы читаете, найдите позицию файла, где он принадлежит, и запишите его.Таким образом, вы можете загружать произвольно большие файлы и не ограничиваться памятью.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...