You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

React中FormData无法附加文件的问题咨询

React中FormData无法附加文件的问题咨询

我正在开发一个支持用户上传文件的React组件,文件被管理在一个state数组中,每个文件都带有额外的元数据,比如唯一的id(DataGrid所需)和docType字段(例如INVOICE)。

状态定义

export interface EnrichedFile {
  id: string; // Unique ID for each file (required for DataGrid)
  docType: string; // A description of the file, e.g., INVOICE
  file: File; // The actual file object
}

const [selectedFiles, setSelectedFiles] = useState<EnrichedFile[]>([]);

组件代码

以下是组件中用户可通过拖放或浏览选择文件上传的相关代码片段:

return (
  <Box component="div" className="w-96 overflow-hidden">
     .....
  </Box>
    {selectedFiles.length !== 0 && (
      <Animated className="w-full mt-4 h-48" animationIn="fadeInUp" animationOut="fadeOut" isVisible={true}>
        <ExDataGrid
          processRowUpdate={updateRowHandler}
          disableColumnMenu
          disableColumnFilter
          disableDensitySelector
          columnHeaderHeight={36}
          slots={{
            footer: () => (
              <div className="flex justify-center">
                <LoadingButton onClick={uploadHandler} variant="contained" color="primary" loading={isPending}>
                  Upload
                </LoadingButton>
              </div>
            ),
          }}
          columns={columnsDocumentsUpload(deleteFileUpload)}
          rows={selectedFiles}
        />
      </Animated>
    )}
  </Box>
);

上传流程与问题

当我点击Upload按钮时,会创建一个FormData对象,尝试附加文件和元数据后通过Axios发送到服务器,但检查时发现FormData是空的。

我的uploadHandler函数如下:

const uploadHandler = useCallback(async () => {
  // Validate that all files have a docType
  const hasError = selectedFiles.some(file => file.docType.trim() === '');
  if (hasError) {
    return toast.error('Please select a document type for all files');
  }

  // Create FormData object
  const formData = new FormData();
  selectedFiles.forEach(file => {
    if (file.file instanceof File) {
      formData.append('files', file.file); // Append the actual file
      formData.append('metadata', JSON.stringify({ id: file.id, docType: file.docType })); // Include metadata for each file
    } else {
      console.error("Invalid file object:", file.file);
    }
  });

  // Debugging: Log FormData entries
  for (const [key, value] of formData.entries()) {
    console.log(`${key}:`, value);
  }

  mutate(formData);
}, [selectedFiles, mutate]);

预期行为

FormData对象应包含附加的文件(files)和元数据(id、docType),并成功发送到服务器。

疑问

  • 为什么明明selectedFiles包含有效的File对象,FormData却为空?
  • 我附加文件到FormData的方式是否有误?

备注:内容来源于stack exchange,提问作者Roni Jack Vituli

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.14 17:08:03