Split an uploaded file into multiple chunks using javascript

后端 未结 2 986
一向
一向 2020-12-05 21:08

I\'m looking for a way to split up any text/data file on the front end in the browser before being uploaded as multiple files. My limit is 40KB per upload. So if a user uplo

相关标签:
2条回答
  • 2020-12-05 21:24

    There is no need for reading the content into ram with the FileReader using base64 will only increase the size of what you need to upload

    Use Blob.slice to get chunks

    // 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())
    }
    
    0 讨论(0)
  • 2020-12-05 21:34

    You could avoid having to base64 encode by using a FileReader and then sending as binary:

    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"/>

    0 讨论(0)
提交回复
热议问题