乐闻世界logo
搜索文章和话题

How to use react-query useMutation with a multi-part file upload?

7 个月前提问
5 个月前修改
浏览次数69

1个答案

1

在React Query中使用useMutation实现分片上传文件的步骤如下:

1. 准备文件分片

首先需要将要上传的文件分割成小块(分片)。这通常可以通过在前端代码中处理文件对象实现。你可以定义一个函数来切割文件:

javascript
function splitFile(file, chunkSize) { let chunks = []; let count = Math.ceil(file.size / chunkSize); for (let i = 0; i < count; i++) { let chunk = file.slice(chunkSize * i, Math.min(file.size, chunkSize * (i + 1))); chunks.push(chunk); } return chunks; }

2. 定义上传函数

创建一个函数来处理单个分片的上传。这个函数将被useMutation调用:

javascript
async function uploadChunk(chunk, index, fileId) { const formData = new FormData(); formData.append("file", chunk); formData.append("index", index); formData.append("fileId", fileId); const response = await fetch("https://your-api.com/upload", { method: "POST", body: formData, }); return response.json(); }

3. 使用 useMutation 进行管理

在你的组件中使用useMutation来管理文件上传,包括错误处理和状态更新:

javascript
import { useMutation } from 'react-query'; function FileUploader({ file }) { const mutation = useMutation(({ chunk, index, fileId }) => uploadChunk(chunk, index, fileId), { onSuccess: (data) => { console.log('Chunk uploaded successfully:', data); }, onError: (error) => { console.error('Failed to upload chunk:', error); }, }); const handleUpload = async () => { const chunkSize = 1024 * 1024; // 1MB const chunks = splitFile(file, chunkSize); const fileId = generateFileId(); // Assume this function generates a unique file ID chunks.forEach((chunk, index) => { mutation.mutate({ chunk, index, fileId }); }); }; return ( <div> <button onClick={handleUpload} disabled={mutation.isLoading}> {mutation.isLoading ? 'Uploading...' : 'Upload File'} </button> {mutation.isError && <p>Error uploading file</p>} {mutation.isSuccess && <p>File uploaded successfully</p>} </div> ); }

4. 错误处理和重试策略

你可以在useMutation中配置重试策略,比如重试次数或根据特定条件重试:

javascript
const mutation = useMutation(uploadChunk, { retry: (failureCount, error) => error.status < 500 && failureCount < 3, });

总结

通过将文件分割为多个块,并使用React Query的useMutation来管理每个块的上传,你可以有效地实现大文件的分片上传。这样做的好处是你可以轻松地跟踪每个分片的上传状态,并且在出现问题时只需要重新上传失败的分片,而不是整个文件。

2024年6月29日 12:07 回复

你的答案