IPhone上使用git同步博客

IPhone上使用git同步博客

大文件分片上传是一种将大文件分成多个小块并逐个上传的方法。这种方法可以提高上传效率,并在网络中断时实现续传。以下是一个大文件分片上传的基本实现步骤:

  1. 前端实现:

    • 文件选择:用户选择要上传的文件。
    • 分片处理:将大文件分成若干小块。
    • 发送分片:逐个上传分片到服务器。
    • 续传处理:记录已上传的分片,在网络中断时继续上传未完成的部分。
  2. 后端实现:

    • 接收分片:接收并存储文件分片。
    • 合并分片:在所有分片上传完成后,将分片合并成完整文件。
    • 续传处理:支持前端请求的断点续传。

下面是一个简单的示例,演示如何使用前端和后端实现大文件分片上传。

前端代码(使用JavaScript)

// HTML 文件选择器
<input type="file" id="fileInput" />

<script>
  const fileInput = document.getElementById('fileInput');
  const chunkSize = 5 * 1024 * 1024; // 分片大小,5MB

  fileInput.addEventListener('change', async (event) => {
    const file = event.target.files[0];
    const totalChunks = Math.ceil(file.size / chunkSize);

    for (let i = 0; i < totalChunks; i++) {
      const start = i * chunkSize;
      const end = Math.min(file.size, start + chunkSize);
      const chunk = file.slice(start, end);

      const formData = new FormData();
      formData.append('chunk', chunk);
      formData.append('index', i);
      formData.append('totalChunks', totalChunks);
      formData.append('fileName', file.name);

      try {
        await fetch('http://localhost:3000/upload', {
          method: 'POST',
          body: formData,
        });
        console.log(`Chunk ${i + 1}/${totalChunks} uploaded successfully`);
      } catch (error) {
        console.error(`Chunk ${i + 1}/${totalChunks} upload failed`, error);
      }
    }

    console.log('All chunks uploaded');
  });
</script>

后端代码(使用Node.js和Express)

const express = require('express');
const multer = require('multer');
const fs = require('fs');
const path = require('path');

const app = express();
const upload = multer({ dest: 'uploads/' });

app.post('/upload', upload.single('chunk'), (req, res) => {
  const { index, totalChunks, fileName } = req.body;
  const chunk = req.file;

  const filePath = path.join(__dirname, 'uploads', fileName);

  // 追加模式写入文件
  fs.appendFileSync(filePath, fs.readFileSync(chunk.path));
  fs.unlinkSync(chunk.path);

  if (parseInt(index) + 1 === parseInt(totalChunks)) {
    console.log(`File ${fileName} uploaded successfully`);
  }

  res.sendStatus(200);
});

app.listen(3000, () => {
  console.log('Server started on port 3000');
});

进一步优化

  1. 断点续传:

    • 前端在每次上传分片时记录当前进度,网络中断时可以继续上传未完成的部分。
    • 后端保存已上传的分片信息,客户端请求时返回已上传的分片列表,前端根据此信息进行续传。
  2. 合并分片:

    • 后端在接收所有分片后,将分片合并成一个完整文件。
    • 可以在每次接收到分片时检查是否所有分片都已上传完毕,如果是,则进行合并操作。
  3. 安全和校验:

    • 使用 MD5 或 SHA256 对分片进行校验,确保文件完整性。
    • 实现用户认证和权限控制,确保只有授权用户可以上传文件。

这样可以实现一个可靠的大文件分片上传系统。