使用React和ASP.NET Core API端点上传CSV接受IFormFile会出现“Object reference not set to an instance of an object”错误

tct7dpnv  于 2023-06-19  发布在  React
关注(0)|答案(1)|浏览(194)

我已经创建了一个端点,它接受CSV文件,解析它(在CsvHelper的帮助下),进行一些转换,然后将该数据持久化到我的SQL Server数据库。我能够通过API很好地传递CSV文件,但是我遇到了一个问题,将这个端点连接到我的React前端,我可以通过UI上传CSV并调用端点来完成其余的工作。而是抛出了400:“Object reference not set to an instance of an object”错误。我已经看过了一吨的SO职位,有一个类似的问题,以我和尝试的解决方案,但他们都没有为我的情况工作。
FileModel类:

public class FileModel
{
    public IFormFile FormFile { get; set; }
}

上传端点:

// I have these attributes here since the CSVs I will be uploading are pretty large.
[DisableRequestSizeLimit]
[RequestFormLimits(MultipartBodyLengthLimit = 234217728)]
[HttpPost("Upload")]
public async Task<ActionResult> CsvUpload([FromForm] FileModel file)
{
    // Endpoint does the parsing and persisting here...
}

我不认为问题在于我在端点内做了什么,所以我省略了这一点,但如果需要,请让我知道。
React.js:

const reqHeaders = { 
                headers: {
                    'Accept': 'application/json, application/octet-stream, application/csv, text/plain, application/x-www-form-urlencoded, multipart/form-data, text/csv, */*',
                },
            }
            let formData = new FormData()
            formData.append('file', new Blob([fileSelector.current.files[0]]))
            apiCalls.post("https://localhost:44323/api/MyController/Upload", formData, reqHeaders).then((res) => {
                console.log(res)
                setShowSnackbarSuccess(true)
                setSnackbarMessage(`Successfully uploaded the data.`)
            }).catch((e) => {
                console.error(e)
                setShowSnackbarError(true)
                setSnackbarMessage('Failed to upload the data.')
            }).finally(() => {
                setShowBusyDialog(false)
                setShowUploadProgressModal(false)
                fileSelector.current.value = null
            })

是否需要在FormData对象后追加文件名,或者需要在头文件中添加某些内容?在这一点上,我不太确定这是否是前端或后端的问题,因此最好了解为什么会抛出错误。此外,React代码不是我的代码,而是我的合作伙伴的代码,所以我会尽我所能回答它。
先谢谢你了!

mec1mxoz

mec1mxoz1#

此方法是否:

public async Task<ActionResult> CsvUpload([FromForm] FileModel file)
{
    // Endpoint does the parsing and persisting here...
}

驻留在继承以下内容的控制器中:ControllerBase?
如果是这样,也许您甚至不需要[FromForm] FileModel文件
下面的代码应该能够处理上传的文本文件:

public async Task<ActionResult> CsvUpload()
{
    var uploadedFiles = this.HttpContext.Request.Form.Files;
    foreach (var uploadedFile in uploadedFiles) 
    {
       string fileFullPath = @"../sometempfolder/tempfile.txt";
       if (System.IO.File.Exists(fileFullPath))
          System.IO.File.Delete(fileFullPath);

       using (FileStream stream = System.IO.File.Open(fileFullPath, FileMode.Create, FileAccess.Write))
           {
                 await uploadedFile.CopyToAsync(stream);
           }
          string csvContents = System.IO.File.ReadAllText(fileFullPath);
          // ProcessCSVFile(csvContents);
    }
}

相关问题