загрузка файлов не работает в react native с составным API данных формы nodejs

#node.js #react-native #multer

#node.js #react-native #мультер

Вопрос:

Я пытаюсь загрузить файл изображения с помощью react native, используя nodejs multipart api, но файл не отправляется из FE. Если я консольный запрос.files, он не определен на стороне сервера. Вот мой собственный код react:

        var options = {
           title: 'Select Image',
           storageOptions: {
               skipBackup: true,
               path: 'images'
           }
       };
       ImagePicker.showImagePicker(options, (response) => {
           console.log('Response = ', response);
           if (response.didCancel) {
               console.log('User cancelled image picker');
           } else if (response.error) {
               console.log('ImagePicker Error: ', response.error);
           } else if (response.customButton) {
               console.log('User tapped custom button: ', response.customButton);
           } else {
               console.log('User selected a file form camera or gallery', response);
               const data = new FormData();
               data.append('name', 'avatar');
               data.append('file', {
                   uri: response.uri,
                   type: response.type,
                   name: response.fileName
               });
               const config = {
                   method: 'POST',
                   headers: {
                       'Accept': 'application/json',
                       'Content-Type': 'multipart/form-data',
                   },
                   body: data,
               };
               fetch("http://myapi.com/api/v1/user", config)
                   .then((checkStatusAndGetJSONResponse) => {
                       console.log(checkStatusAndGetJSONResponse);
                   }).catch((err) => { console.log(err) });
           }
       }
       )
  

и код Nodejs:

 const storage = multer.memoryStorage({
    destination:(req, file, callback) => {
        callback(null, '')
    }
});

const upload = multer({ storage: storage }).array('file');
    upload(req,res,(err) => {
        if(err) {
            console.log('ERROR: ',err);
            return res.end("Error uploading file.");
        }else{
            console.log('REQUEST: ',req.files);
        }
    });



  

Я не могу загрузить изображение с некоторыми пользовательскими данными, пожалуйста, дайте мне знать, что я здесь делаю не так
Спасибо

Ответ №1:

поскольку вы отправляете данные формы в теле, они будут содержать только эти данные формы.

если вы хотите отправить данные формы плюс некоторые другие данные, попробуйте добавить данные формы в другой объект, а затем добавить другие данные в тот же объект с помощью пары ключ-значение.

Я создал форму регистрации пользователя, в которой у меня есть несколько полей ввода и загрузка профиля. Для загрузки я использовал «ngx-file-drop«.

Нравится:-

 const body = {};
body['formData'] = formValues;
body['fileData'] = this.fileDataArray;
  

В этом случае код ts выглядит так, как показано ниже.

 dropped(files: NgxFileDropEntry[]) {
    this.fileError = false;
    this.files = [];
    this.files = files;
    for (const droppedFile of files) {
      // Is it a file?
      if (droppedFile.fileEntry.isFile amp;amp; this.isFileAllowed(droppedFile.fileEntry.name)) {
        this.filesArray.push(droppedFile);
        const fileEntry = droppedFile.fileEntry as FileSystemFileEntry;
         const formData: FormData = new FormData();
        fileEntry.file((file: File) => {
          
        });
        fileEntry.file((file: File) => {
          this.dropFilePath.push(droppedFile.relativePath);
          // append form data
          formData.append('upload', file, droppedFile.relativePath);
          this.dropFile.push(file);
          this.dropFileFlag = true;
        });
      } else {
        // It was a directory (empty directories are added, otherwise only files)
        const fileEntry = droppedFile.fileEntry as FileSystemDirectoryEntry;
        this.dropFilePath = [];
        this.dropFile = [];
        this.files = [];

        this.toaster.error('only this file are allowed : [".jpg", ".jpeg",".gif",".png"]', 'Error', {
          positionClass: 'toast-top-full-width',
        });
        break;
      }
    }
  }
  

и html-код есть.

 <ngx-file-drop [disabled]="isPreview ? true : null" dropZoneLabel="Drop files here" (onFileDrop)="dropped($event)" (onFileOver)="fileOver($event)"(onFileLeave)="fileLeave($event)">
<ng-template ngx-file-drop-content-tmp let-openFileSelector="openFileSelector">
    <span [attr.disabled]="isPreview ? true : null" class="btn">Drop files here or</span>
       <span [attr.disabled]="isPreview ? true : null" (click)="openFileSelector()" class="btn btn-link">click to upload</span>
</ng-template>
</ngx-file-drop>
  

и при отправке формы вы можете сделать так.

 onSubmit() {
    this.submitted = true;

    if (this.form.invalid || (this.submitted amp;amp; this.fileError)) {
      this.toaster.error('Invalid form data..!!', 'ERROR');
      return;
    }
    const formData = this.form.value;
    this.fileDataArray.push(formData.getAll('upload'));
    console.log('this.fileDataArray-------->', this.fileDataArray);
    const body = {};
    body['formData'] = formData;
    body['fileData'] = this.fileDataArray;
    console.log('body------>', body);
    // call below your api function
   }
  

Комментарии:

1. Я думаю, что это угловой код, но я хочу использовать react-native @nilesh-solanki

2. @VishalRana да, это angular, я предложил идею о том, что вы можете отправлять formdata плюс другие данные пользователя в общий объект с другой парой значений kev.

3. моя задача — загрузить файл в react-native, с angular это очень легко сделать.

4. проверили ли вы, что имя добавления данных, которое вы отправляете со стороны клиента, и данные, которые вы извлекаете на сервере, совпадают.

5. просто проверьте эту ссылку, если она вам поможет. < heartbeat.fritz.ai /… >