• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

VueJS i Symfony upload plików - problem

Aruba Cloud PRO i VPS, Openstack, VMWare, MS Hyper-V
0 głosów
131 wizyt
pytanie zadane 30 kwietnia 2021 w PHP przez misiek.sz Bywalec (2,050 p.)

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.

komentarz 30 kwietnia 2021 przez ScriptyChris Mędrzec (190,800 p.)

Tak jakby 2 razy robił się submit formularza

To możesz zweryfikować w zakładce Network devtoolsów przeglądarki - jest tam lista wysłanych requestów.

komentarz 30 kwietnia 2021 przez misiek.sz Bywalec (2,050 p.)
sprawdziłem, submituje tylko raz

Zaloguj lub zarejestruj się, aby odpowiedzieć na to pytanie.

Podobne pytania

0 głosów
0 odpowiedzi 75 wizyt
0 głosów
0 odpowiedzi 217 wizyt
pytanie zadane 8 listopada 2019 w JavaScript przez michal_php Stary wyjadacz (13,680 p.)
0 głosów
2 odpowiedzi 240 wizyt
pytanie zadane 20 sierpnia 2018 w PHP przez kevin Mądrala (5,010 p.)

90,401 zapytań

139,014 odpowiedzi

311,516 komentarzy

60,081 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Sklep oferujący ćwiczenia JavaScript, PHP, rozmowy rekrutacyjne dla programistów i inne materiały

Oto dwie polecane książki warte uwagi. Pełną listę znajdziesz tutaj.

...