Как я могу обнаружить изменение файла во время частичной загрузки? - PullRequest
1 голос
/ 02 апреля 2020

Я выполняю загрузку файла чанка на сервер, и меня интересует такая вещь, как определение того, изменился ли этот файл.

Предположим, я отправляю файл размером 5 МБ. Размер одного куска - 1 МБ. 4 чанка отправляются на сервер, а последний не go из-за разорванного соединения.

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

Чтобы определить, что один из чанков был изменен, необходимо повторно отправить все чанки на сервер, чтобы получить га sh от суммы, но тогда вся нагрузка теряет смысл.

Как определить, что файл был изменен без отправки всех кусков на сервер?

Дополнительно :

Загрузка файлов осуществляется следующим образом:

enter image description here

Сначала браузер отправляет запрос на создание нового сеанса для загрузки файлов.

Параметры запроса:

part_size: 4767232
files: [
  {
    "file_size":4767232,
    "file_type":"application/msword",
    "file_name":"5 mb.doc"
  }
]

Далее:

  • Новые записи о загруженных файлах добавляются в базу данных.
  • Сервер временно создает папки для сто кольцевые куски. (Имя папки - это направляющие записи файла, созданной базой данных.)
  • Метод возвращает направляющие файла.

После получения направляющих браузер разделяет файлы на куски, используя JavaScript Blob.slice () и отправляет каждый чанк как отдельный запрос, прикрепляя идентификатор файла к запросу.

Чанки сохраняются, и после загрузки последнего чанка файл собирается.

Код:

/**
 * @param $binary - The binary data.
 * @param $directory - Current file with chunks directory path.
 */
private static function createChunk($binary, $directory)
{
    //Create a unique id for the chunk.
    $id = 'chunk_' . md5($binary);

    // Save the chunk to dad with the rest of the chunks of the file.
    Storage::put($directory . '/' . $id, $binary);

    // We get a json file with information about uploading session.
    $session = self::uploadSessionInfo($directory);

    // Increase the number of loaded chunks by 1 and add a new element to the subarray chunks.
    $session['chunks_info']['loaded_chunks'] = $session['chunks_info']['loaded_chunks'] + 1;
    $session['chunks_info']['chunks'][] = [
        'chunk_id' => $id
    ];

    // Save the modified session file.
    Storage::put($directory . '/session.json', json_encode($session));

    // If the number of loaded chunks and the number of total chunks are the same, then we create the final file.
    if ($session['chunks_info']['total_chunks'] === $session['chunks_info']['loaded_chunks']) {

        Storage::put($directory . '/' .  $session['file_name'], []);

        foreach ($session['chunks_info']['chunks'] as $key => $value) {
            $file = fopen(storage_path() . '/app/' . $directory . '/' . $value['chunk_id'], 'rb');
            $buff = fread($file, 2097152);
            fclose($file);

            $final = fopen(storage_path() . '/app/'. $directory . '/' . $session['file_name'], 'ab');
            $write = fwrite($final, $buff);
            fclose($final);
        }
    }
}

Визуально выглядит так: enter image description here

...