Cześć,
mam aplikację opartą o VueJS, w której przesyłam formularze axios'em do Symfony 4.3, problem się pojawia przy uploadzie pików, wyskakuje błąd:
PHP Exception Symfony\Component\Mime\Exception\InvalidArgumentException: "The "/tmp/phpFaoA0D" file does not exist or is not readable.
Plik jest uploadowany na serwer ale ten błąd i tak się pojawia. Tak jakby 2 razy robił się submit formularza i zadrugim razem już nie ma pliku w /tmp.
Problem znika gdy nie korzystam z metod w kontrolerze dotyczących formularzy np:
if ($form->isSubmitted() && $form->isValid())
Poniżej mój kod:
VueJS:
save() {
this.isLoading = true;
this.alert.status = false;
this.alert.msg = '';
this.errors = null;
let formData = new FormData();
formData.append('cardFile', this.cardFile);
// for(let i=0; i<this.cardFile.length; i++) {
// formData.append('cardFile[]', this.cardFile[i]);
// }
let fields = {
.......
firstname: this.content.firstname,
secondname: this.content.secondname,
lastname: this.content.lastname,
.......
};
for(var field in fields) {
formData.append(field, this.content[field]);
}
this.$http.post(`/statement/edit/${this.id}`, formData,
{
headers: {
'Content-Type': 'multipart/form-data'
}
}
)
.then(({
data
}) => {
if (data.code == 200) {
this.$store.commit('setIsEdited', true);
this.$router.push({name: 'statementsSingle', params: {id: this.content.id}});
} else {
this.isLoading = false;
this.alert.status = true;
this.alert.type = "danger",
this.alert.msg = data.msg;
this.errors = data.errors;
}
})
.catch(error => {
console.log(error);
});
},
fileUpload(e) {
let files = this.$refs.cardFile.files[0];
this.cardFile = files;
}
Entity:
.....
/**
*
* @Assert\All({
*
* @Assert\File(
* maxSize = "60M",
* mimeTypes = {
* "image/png",
* "image/jpeg",
* "image/jpg",
* "image/gif",},
* mimeTypesMessage = "Dopuszczalne formaty plików to: jpg, png lub gif!"
* )
* })
*/
private $cardFile;
......
public function getCardFile()
{
return $this->cardFile;
}
public function setCardFile($cardFile): self
{
$this->cardFile = $cardFile;
return $this;
}
FormType:
.......
->add('cardFile', FileType::class, [
'multiple' => true,
'mapped' => false,
'attr' => [
'multiple' => 'multiple'
]
])
......
Controller:
/**
*
* @Route("/statement/edit/{id}", name="statementsEdit", methods={"POST"})
*/
public function edit(Request $request, EntityManagerInterface $em, FormFactoryInterface $forms, $id, FileUploader $FileUploader) {
$repo = $this->getDoctrine()->getRepository(Statement::class);
$Statement = $repo->findOneBy(array('id' => $id, 'active' => 1));
$formErrors = new HandleFormErrors();
if (NULL == $Statement) {
throw $this->createNotFoundException();
}
$form = $forms->createNamed('', StatementType::class, $Statement);
$requestData = $request->request->all();
$files = $request->files->get('cardFile');
$data = json_encode($requestData, true);
$data = json_decode($data, true);
if($files)
$data['cardFile'] = [$files];
else
$data['cardFile'] = NULL;
$form->submit($data);
if ($form->isSubmitted() && $form->isValid()) {
$em->flush();
$cardFile = $data['cardFile'];
if($cardFile) {
$FileUploader->upload($cardFile[0]);
}
return $this->json([
'code' => 200,
'msg' => 'Zmiany zostały zapisane',
'files' => $cardFile[0]
]);
}
return $this->json([
'code' => '400',
'errors' => $formErrors->getErrorMessages($form),
'msg' => 'Popraw błędy',
]);
}
Ma ktoś pomysł jak ten problem rozwiązać? Może tak się nie powinno walidować formularzy po stronie Symfony jeśli przesyłam je ajaxem? Ale to wygody sposób bo nie trzeba bawić się dodatkowo z Validator.