我试图发送一个csv文件到我的Django API和响应过程数据,但当我发送它时,我得到错误:
django.utils.datastructures。MultiValueDictKeyError:"文件">
这是我的代码:
import { useState } from 'react';
import './App.css';
function App() {
const [file, setFile] = useState(null);
const uploadFiles = e =>{
setFile(e);
}
const insertFile = async() => {
const f = new FormData();
f.append("file", file);
await fetch(
api,
{
method: 'POST',
headers: { 'content-type': 'multipart/form-data' },
body: f,
})
.then((response) => response.json())
.then((data)=>{
console.log(data);
})
.catch(error=>{
console.log(error);
});
}
return (
<>
<input type="file" name="file" onChange={(e)=>uploadFiles(e.target.files)}/>
<button onClick={()=>insertFile()}>Insertar</button>
</>
);
}
export default App;
这是处理信息的view。py文件,现在,我只想在前端获取csv信息,所以如何处理数据的逻辑现在不重要
@api_view(['POST'])
def eda(request):
file = request.FILES['file']
data = []
with open(file, encoding='utf-8') as csvf:
csvReader = csv.DictReader(csvf)
for rows in csvReader:
data.append(rows)
response = {
'csvData': data
}
return Response(response)
似乎您的文件根本没有添加到FormData
中。这是因为您发送的是一个文件列表,而不是单个文件。所以不用
<input type="file" name="file" onChange={(e)=>uploadFiles(e.target.files)}/>
使用这个
<input type="file" name="file" onChange={(e)=>uploadFiles(e.target.files[0])}/>
,在Django端使用:
file = request.FILES.get('file') # won't raise exception
if file is None:
# show some error response
用request.data.get('file')
代替request.FILES.get('file')