Разделите загруженный файл на несколько частей с помощью javascript

Я ищу способ разделить любой текстовый файл / файл данных на передней панели браузера перед загрузкой в ​​виде нескольких файлов. Мой лимит составляет 40 КБ на загрузку. Поэтому, если пользователь загружает файл размером 400 КБ, он разделит этот файл на 10 отдельных фрагментов или 10 отдельных файлов во внешнем интерфейсе, прежде чем загружать его на сервер.

В настоящее время я делаю это, конвертируя этот файл в строку в формате base64, а затем разбиваю эту строку на 40 КБ, что дает 10 отдельных фрагментов. Оттуда я загружаю каждый фрагмент с именем файла chunk-1-of-10, chunk-2-of-10 ...

При извлечении этих файлов я просто объединяю все эти фрагменты и деконвертирую их из base64 в формат файла.

Есть ли лучший способ сделать это? Есть ли библиотека, которая обрабатывает все это вместо того, чтобы писать с нуля? Я не уверен, что маршрут base64 - лучший способ сделать это.

Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
10
0
10 246
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Вы можете избежать кодирования base64, используя FileReader, а затем отправляя его в двоичном формате:

const url = 'http://www.example.com/upload';

document.getElementById('file-uploader').addEventListener('change', function(e) {
    const size = 40000;
    var reader = new FileReader();
    var buf;
    var file = document.getElementById('file-uploader').files[0];
    reader.onload = function(e) {
        buf = new Uint8Array(e.target.result);
        for (var i = 0;  i < buf.length; i += size) {
            var fd = new FormData();
            fd.append('fname', [file.name, i+1, 'of', buf.length].join('-'));
            fd.append('data', new Blob([buf.subarray(i, i + size)]));
            var oReq = new XMLHttpRequest();
            oReq.open("POST", url, true);
            oReq.onload = function (oEvent) {
               // Uploaded.
            };
            oReq.send(fd);
        }
    }
      
    reader.readAsArrayBuffer(file);
});
<input type = "file" id = "file-uploader"/>

Как нам вывести ответ сервера?

Parsa Yazdani 25.04.2020 10:42
Ответ принят как подходящий

Нет необходимости читать содержимое в оперативную память с помощью FileReader. использование base64 только увеличит размер того, что вам нужно загрузить

Используйте Blob.slice для получения чанков

// simulate a file from a input
const file = new File(['a'.repeat(1000000)], 'test.txt')

const chunkSize = 40000
const url = 'https://httpbin.org/post'

for (let start = 0; start < file.size; start += chunkSize) {
  const chunk = file.slice(start, start + chunkSize + 1)
  const fd = new FormData()
  fd.append('data', chunk)

  await fetch(url, {method: 'post', body: fd}).then(res => res.text())
}

Спасибо за решение! Одним из быстрых дополнений к этому было бы добавление «start» ко второму параметру slice () для получения последующих фрагментов. const chunk = file.slice (начало, начало + размер блока + 1).

Pramod Mali 28.11.2019 08:40

Как нам вывести ответ сервера?

Parsa Yazdani 25.04.2020 10:33

@ParsaYazdani console.info(await fetch(url, {method: 'post', body: fd}).then(res => res.text()))

Sahil 23.05.2020 02:18

У нас это сработало, однако нам пришлось внести небольшую корректировку, убрать +1 при вычислении чанка: const chunk = file.slice(start, start + chunkSize)

Ralf Jahr 16.02.2021 11:12

Другие вопросы по теме