reactjs - 如何在前端(在 React 中)上传文件并将它们发送到后端(Laravel/API)?
问题描述
我正在尝试在云中托管通过我的应用程序中的输入接收到的一些文件,但是我无法将信息从前端发送到后端。使用的技术:前端:ReactJs (TypeScript)、MaterialUi、StyledComponents 后端:REST API (Washable)
我正在使用 FormData 来接收参数并将它们传递到后端(这工作得很好,因为在失眠症中进行的测试中,图像会进入云端):
export default function ModalAnexo(props: ModalAnexoProps) {
const [cnh, setCnh] = useState('');
const [cpf, setCpf] = useState('');
const [rg, setRg] = useState('');
function salvaranexo(e: FormEvent) {
e.preventDefault();
const AnexoData = new FormData();
AnexoData.append('cnh', cnh);
AnexoData.append('cpf', cpf);
AnexoData.append('rg', rg);
baseUrl
.post('/anexo/store', AnexoData, {
headers: { 'Content-Type': 'multipart/form-data', 'Accept':'application/json' },
})
.then(() => {
callModel('Sucesso', 'Cadastro realizado com sucesso.', 'Ok');
setOpen(false);
})
.catch((error) => {
callModel('Erro', 'Ocorreu um erro', 'OK');
});
}
<form onSubmit={salvaranexo}>
<DialogTitle id="alert-dialog-title">{'Inserir arquivos:'}</DialogTitle>
<DialogContent
style={{
display: 'grid',
flexDirection: 'row',
alignItems: 'center',
justifyContent: 'center',
flexWrap: 'wrap',
gap: '1.3rem',
}}
>
<div>
<TextField
id="cnh"
value={cnh}
onChange={(e) => setCnh(e.target.value)}
label="CNH Frente"
type="file"
variant="outlined"
inputProps={{ accept: '.png, .pdf, .jpg, .jpeg' }}
InputLabelProps={{
shrink: true,
}}
></TextField>
<IconButton
onClick={function resetaCNH() {
setCnh('');
}}
aria-label="delete"
>
<DeleteIcon />
</IconButton>
</div>
<div>
<TextField
id="cnh2"
value={cnh2}
onChange={(e) => setCnh2(e.target.value)}
label="CNH Verso"
type="file"
variant="outlined"
inputProps={{ accept: '.png, .pdf, .jpg, .jpeg' }}
InputLabelProps={{
shrink: true,
}}
></TextField>
<IconButton
onClick={function resetaCNH2() {
setCnh2('');
}}
aria-label="delete"
>
<DeleteIcon />
</IconButton>
</div>
<div>
<TextField
id="cpf"
value={cpf}
onChange={(e) => setCpf(e.target.value)}
label="CPF Frente"
type="file"
variant="outlined"
inputProps={{ accept: '.png, .pdf, .jpg, .jpeg' }}
InputLabelProps={{
shrink: true,
}}
></TextField>
<IconButton
onClick={function resetaCPF() {
setCpf('');
}}
aria-label="delete"
>
<DeleteIcon />
</IconButton>
</div>
<div>
拉拉维尔:
public function store(Request $request)
{
$request->file('cnh')->storeAs($request->id_cliente.$request->id_funcionario.'cnhfrente', $request->cnh->getClientOriginalName(), 'gcs');
$data = $request->all();
return $this->service->store($data);
}
当我这样做时,在云中,我得到的文件是一个空图像,配置了我在输入中发送的图像的扩展名。
有谁知道我该如何解决这个问题?
解决方案
Material UI 的“TextField”组件不适用于输入字段类型 = 文件,因此我将输入更改为另一个并添加代码 onChange={(e) => setCnh(e.target.files[0])}。
推荐阅读
- javascript - 显示带有 openlayers 和外部 geojson 文件的简单图标
- javascript - 使用 Flask 从目录中获取leaflet.js 和leaflet.css 时未出现传单地图
- java - 如何将响应存储在 Volley 的变量中?
- java - Java 中的短格式吐司
- c# - 如何在sql查询命令中使用方法输入中退出的参数?
- postgresql - 使用“CREATE TABLE AS”创建的分区表
- android - Android Room @Relation 和索引
- python - 将纯文本添加到 Nuke 简单面板窗口
- powershell - Powershell 脚本不会听 if 语句
- firefox - 如何在我登录网站时阻止 Windows Firefox(V 69.0.2 64 位)要求保存密码?