首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用Tus协议上传多个文件?

如何使用Tus协议上传多个文件?
EN

Stack Overflow用户
提问于 2022-07-08 21:43:43
回答 1查看 306关注 0票数 1

信息:我想使用图-杰-客户上传多个文件。当我试图上传多个文件时,我正面临一些问题。

发行

  • 如果我试图上传多个文件,进度条是浮动的,因为块索引不正确,所以进度条是浮动的。
  • 我希望每个文件上传后,第一个文件完成后,下一个文件开始。

代码语言:javascript
复制
const fileInput = document.querySelector('#js-file-input')
    const dataDiv = document.querySelector('#data-pre');
    const toggleBtn = document.querySelector('#toggle-btn')
    const progressBar = document.querySelector('.progress-bar')
    const textProgress = document.querySelector('#js-upload-text-progress')
    const uploadList = document.querySelector('#upload-list')

    function reset() {
      progressBar.style.width = `${0}%`
      textProgress.textContent = ""
    }
    /**
   * Turn a byte number into a human readable format.
   * Taken from https://stackoverflow.com/a/18650828
   */
    function formatBytes(bytes, decimals = 2) {
      if (bytes === 0) return '0 Bytes'

      const k = 1024
      const dm = decimals < 0 ? 0 : decimals
      const sizes = ['Bytes', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB']
      const i = Math.floor(Math.log(bytes) / Math.log(k))
      return parseFloat((bytes / Math.pow(k, i)).toFixed(dm)) + ' ' + sizes[i]
    }

    fileInput.addEventListener('change', (e) => {
      const files = e.target.files;
      let convertedFiles = [];

      Object.keys(files).forEach(k => {
        convertedFiles = [
          ...convertedFiles,
          { id: URL.createObjectURL(files[k]), file: files[k] }
        ];
      });

      convertedFiles.map(i => {
        const file = i.file;
        const chunkSize = parseInt(5242880, 10)

        let upload = new tus.Upload(file, {
          endpoint: "https://tusd.tusdemo.net/files/",
          // endpoint: "http://localhost:8000/tus/upload/",
          chunkSize,
          retryDelays: [0, 1000, 3000, 5000],
          metadata: {
            filename: file.name,
            filetype: file.type
          },
          onError: function (error) {
            console.log("Failed because: " + error);
          },
          onProgress: function (bytesUploaded, bytesTotal) {
            const percentage = ((bytesUploaded / bytesTotal) * 100).toFixed(2)
            progressBar.style.width = `${percentage}%`
            textProgress.textContent = `Uploaded ${formatBytes(bytesUploaded)} of ${formatBytes(bytesTotal)} (${percentage})`
            console.log(bytesUploaded, bytesTotal, percentage + "%");
          },
          onSuccess: function () {
            const anchor = document.createElement('a')
            anchor.textContent = `Download ${upload.file.name} (${upload.file.size} bytes)`
            anchor.href = upload.url
            anchor.className = 'btn btn-success'
            uploadList.appendChild(anchor)
            console.log("Download %s from %s", upload.file.name, upload.url);

            reset()
          }
        });

        toggleBtn.addEventListener('click', (e) => {
          upload.start()
        });

        dataDiv.innerHTML +=
          `
          <div class="file-data" key=${i.file.id}>
            <img alt="what" src=${i.id} width="150" />
            <div>name: ${i.file.name}</div>
            <div>type: ${i.file.type}</div>
            <div>size: ${i.file.size}</div>
          </div>
       `
      });
    });
代码语言:javascript
复制
 <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.0.2/dist/css/bootstrap.min.css" rel="stylesheet"
    integrity="sha384-EVSTQN3/azprG1Anm3QDgpJLIm9Nao0Yz1ztcQTwFspd3yD65VohhpuuCOmLASjC" crossorigin="anonymous">

<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/tus-js-client@3.0.0-0/dist/tus.min.js"></script>
<div class="upload-card">
      <div class="row">
        <div class="col-md-12">

          <div id="input-section">
            <div class="heading">Select a file you want to upload:</div>
            <input type="file" id="js-file-input" accept="image/*, video/*" multiple>
            <!-- <input type="file" id="input-file" accept="image/*" multiple> -->

          </div>

          <div id="progress-section">
            <div class="heading" id="heading"></div>
            <div class="d-flex">
              <div class="flex-grow-1">
                <div class="progress">
                  <div class="progress-bar progress-bar-striped bg-success" role="progressbar"></div>
                </div>
                <div class="upload-text-progress" id="js-upload-text-progress"></div>
              </div>
              <div class="js-action-btn">
                <button class="btn stop" id="toggle-btn">start</button>
              </div>
            </div>
          </div>
        </div>
      </div>
    </div>
    <hr>
    <h3>Uploads</h3>
    <p>Succesful uploads will be listed here. Try one!</p>
    <p id="upload-list"></p>
    <br>
    <hr>
    <div id="data-pre"></div>

EN

回答 1

Stack Overflow用户

发布于 2022-08-22 15:06:45

我找到了解决办法。

这是我的工作,你只需要改变你的Javascript代码和删除HTML进度条。然后,您可以编辑css,使其更好。;)

编辑我添加了一个演示。

代码语言:javascript
复制
  const fileInput = document.querySelector('#js-file-input')
  const dataDiv = document.querySelector('#data-pre');
  const toggleBtn = document.querySelector('#toggle-btn')
  const uploadList = document.querySelector('#upload-list')


  function reset() {
    convertedFiles.map((i, key) => {
      $('.progress-bar_' + key).css('width', '0%');
      $('#js-upload-text-progress_' + key).html('');
    })
  }
  /**
  * Turn a byte number into a human readable format.
  * Taken from https://stackoverflow.com/a/18650828
  */

  function formatBytes(bytes, decimals = 2) {
    if (bytes === 0) return '0 Bytes'

    const k = 1024
    const dm = decimals < 0 ? 0 : decimals
    const sizes = ['Bytes', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB']
    const i = Math.floor(Math.log(bytes) / Math.log(k))
    return parseFloat((bytes / Math.pow(k, i)).toFixed(dm)) + ' ' + sizes[i]
  }

  let convertedFiles = [];
  fileInput.addEventListener('change', (e) => {
    dataDiv.innerHTML = '';
    const files = e.target.files;
    Object.keys(files).forEach(k => {
      convertedFiles = [
      ...convertedFiles,
      { id: URL.createObjectURL(files[k]), file: files[k]}
      ];
    });


    convertedFiles.map((i, key) => {
      const file = i.file;
      key ++
      const chunkSize = parseInt(5242880, 10)

      dataDiv.innerHTML +=
      `
      <div class="file-data" key=${key}>
        <img alt="what" src=${i.id} width="150" />
        <div>name: ${i.file.name}</div>
        <div>type: ${i.file.type}</div>
        <div>size: ${i.file.size}</div>
        <div class="flex-grow-1">
          <div class="progress pr_${key}">
            <div class="progress-bar_${key} progress-bar-striped bg-success" role="progressbar"></div>
          </div>
          <div class="upload-text-progress" id="js-upload-text-progress_${key}"></div>
        </div>
      </div>
      `

      let upload = new tus.Upload(file, {
        endpoint   : 'https://tusd.tusdemo.net/files/',
        // endpoint: "http://localhost:8000/tus/upload/",
        chunkSize,
        retryDelays: [0, 1000, 3000, 5000],
        metadata: {
          filename: file.name,
          filetype: file.type
        },
        onError: function (error) {
          console.log("Failed because: " + error);
        },
        onProgress: function (bytesUploaded, bytesTotal) {
          const percentage = ((bytesUploaded / bytesTotal) * 100).toFixed(2)
          $('.progress-bar_' + key).css('width', percentage + '%');
          $('#js-upload-text-progress_' + key).html(`Uploaded ${formatBytes(bytesUploaded)} of ${formatBytes(bytesTotal)} (${percentage})`);
        },
        onSuccess: function () {
          const anchor = document.createElement('a')
          anchor.textContent = `Download ${upload.file.name} (${upload.file.size} bytes)`
          anchor.href = upload.url
          anchor.className = 'btn btn-success'
          uploadList.appendChild(anchor)
          console.log("Download %s from %s", upload.file.name, upload.url);
        }
      });

      toggleBtn.addEventListener('click', (e) => {
        reset();
        upload.start()
      });

    });
  });
代码语言:javascript
复制
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.0.2/dist/css/bootstrap.min.css" rel="stylesheet"
integrity="sha384-EVSTQN3/azprG1Anm3QDgpJLIm9Nao0Yz1ztcQTwFspd3yD65VohhpuuCOmLASjC" crossorigin="anonymous">

<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/tus-js-client@3.0.0-0/dist/tus.min.js"></script>
<div class="upload-card">
  <div class="row">
    <div class="col-md-12">

      <div id="input-section">
        <div class="heading">Select a file you want to upload:</div>
        <input type="file" id="js-file-input" accept="image/*, video/*" multiple>
        <!-- <input type="file" id="input-file" accept="image/*" multiple> -->

      </div>

      <div id="progress-section">
        <div class="heading" id="heading"></div>
        <div class="d-flex">
          <div class="js-action-btn">
            <button class="btn stop" id="toggle-btn">start</button>
          </div>
        </div>
      </div>
    </div>
  </div>
</div>
<hr>
<h3>Uploads</h3>
<p>Succesful uploads will be listed here. Try one!</p>
<p id="upload-list"></p>
<br>
<hr>
<div id="data-pre"></div>

希望它能帮上忙

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72917279

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档