vue实现大文件切片上传

9 篇文章 0 订阅

利用file里面的slice方法可以将文件切片,前端进行切片处理向http并发传递。等所有切片上传完成后再向服务器发送一个合并切片的请求。

<input type="file" @change="onChange" ref="fileInput" />
onChange() {
  let self = this;
  let file = this.$refs.fileInput.files[0];
  if (!file) return;
  // 这里我们将切片固定成六分,也可以固定大小上传
  let axiosArray = [];
  let chunkList = [];
  let chunkSize = file.size / 6;
  let current = 0;
  let i = 0;
  let fileName = Date().getTime() + "_" + file.name;
  while (current < 6) {
    chunkList.push({
      chunk: file.slice(current * chunkSize, (current + 1) * chunkSize),
      fileName: current + "_" + fileName
    });
    current++;
  }
  // 切片并发传给后端,这里我们要注意切片上传时请求头是 multipart/form-data 合并切片时请求头是x-www-form-urlencoded,只能上传键值对
  chunkList.map(function(item) {
    let form = new FormData();
    form.append("file", item.chunk);
    form.append("fileName", item.fileName);
    axiosArray.push(
      self.$axios.post("/api/album/upload", form, {
        headers: { "Content-Type": "multipart/form-data" }
      })
    );
  });
  // 所有切片上传成功后合并
  Promise.all(axiosArray).then(res => {
    self.$axios.post("/api/album/uploadMerge", `fileName=${fileName}`);
  });
}
  • 4
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
文件切片上传是一种常见的文件上传方式,可以通过将大文件分成多个小文件,然后分别上传,最后在服务器端将这些小文件合并成一个完整的文件。这种方式可以避免上传文件时网络不稳定或中断的情况,同时也可以减轻服务器端的压力。 下面是一个基于 PHP 7.3 和 Vue 的大文件切片上传的示例: 前端部分: 1. 在 Vue 组件中定义一个 input 标签,用户选择需要上传文件后触发上传事件: ``` <template> <div> <input type="file" @change="uploadFile" /> </div> </template> ``` 2. 在 uploadFile 方法中,使用 FileReader API 将文件分割成多个小文件,然后使用 axios 库将这些小文件逐个上传到服务器: ``` <script> import axios from 'axios'; export default { methods: { uploadFile(event) { const file = event.target.files[0]; const chunkSize = 1024 * 1024; // 将文件分割为 1MB 的小文件 const totalChunks = Math.ceil(file.size / chunkSize); const chunks = []; for (let i = 0; i < totalChunks; i++) { const start = i * chunkSize; const end = Math.min(start + chunkSize, file.size); const chunk = file.slice(start, end); chunks.push(chunk); } const formData = new FormData(); formData.append('filename', file.name); formData.append('totalChunks', totalChunks); chunks.forEach((chunk, index) => { formData.append(`chunk${index}`, chunk); }); axios.post('/upload', formData).then(response => { console.log(response.data); }); } } }; </script> ``` 后端部分: 1. 创建一个 upload.php 文件,用于处理文件上传请求: ``` <?php if ($_SERVER['REQUEST_METHOD'] === 'POST') { $filename = $_POST['filename']; $totalChunks = $_POST['totalChunks']; $chunks = []; for ($i = 0; $i < $totalChunks; $i++) { $chunkName = "chunk{$i}"; if (isset($_FILES[$chunkName])) { $chunk = file_get_contents($_FILES[$chunkName]['tmp_name']); $chunks[] = $chunk; } } $content = implode('', $chunks); file_put_contents($filename, $content); echo 'File uploaded successfully'; } ``` 2. 在 PHP 配置文件 php.ini 中设置上传文件的最大大小和上传文件的最大数量: ``` upload_max_filesize = 100M max_file_uploads = 20 ``` 这样,就完成了一个基于 PHP 7.3 和 Vue 的大文件切片上传功能。需要注意的是,这里只是一个简单的示例,实际应用中还需要考虑上传进度、上传失败重试等问题。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值