Невозможно получить изображение на узле под углом - PullRequest
0 голосов
/ 20 сентября 2018

У меня есть реактивная форма в angular 6, которую я пытаюсь использовать для отправки изображения и некоторых текстовых полей.

Вот оно

<form [formGroup]="imageUpload" (ngSubmit)="imageUploadSubmitted()" method="post" enctype="multipart/form-data" >
  <div id="imageDrop" (click)='imageInput.click()' (drop)="drop($event)" (dragover)="allowDrop($event)" #imageDrop></div> 
  <input type="file" formControlName="imageInput" required #imageInput id="imageInput" name = 'image' (change)='imageChange($event)' accept=".png, .jpg, .jpeg, .gif" > <!-- hide with css -->
    <input type="text" formControlName="imageName" placeholder="name" required >
  <button type="submit" >Submit</button>
</form>

Так что, либо вы щелкаете мышью по области перетаскивания, которую открывает средство выбора файлов, либо вы отбрасываете изображение.

В любом случае, получите изображение и сохраните его в переменной.

  selectedFile:File=null;

  drop(e) {
    e.preventDefault();  
    this.imageUpload.controls.imageInput.reset();  
    this.selectedFile = e.dataTransfer.files[0];
    this.checkfiles(e.dataTransfer.files);
  }

  imageChange(e){        
    this.selectedFile = e.target.files[0];
    this.checkfiles(e.target.files);    
  }

проверьте выбранные файлы

   acceptedImageTypes = {'image/png': true,'image/jpeg': true,'image/gif': true};
  checkfiles(files){      
    if (this.acceptedImageTypes[files[0].type] !== true){
      this.imageDrop.nativeElement.innerHTML="Not an image";          
      return;   
    }
    else if (files.length>1){
      this.imageDrop.nativeElement.innerHTML="Only one image/time";           
      return;   
    }    
    else { this.readfiles(files); }
  }

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

  readfiles(files){
    const reader = new FileReader();
    let image = new Image();      
    reader.onload =  (event) =>{      
      this.imageDrop.nativeElement.innerHTML="";                
      let fileReader = event.target as FileReader;
      image.src = fileReader.result;
      image.width = 150; 
      this.imageDrop.nativeElement.appendChild(image);  
    };
    reader.readAsDataURL(files[0]);        
  }

ОК, теперь, когдаФорма отправлена, установите selectedFile в качестве входного значения файла и отправьте форму.

Сначала я пытаюсь установить значение imageInput, изменив его value.Затем я также пытаюсь добавить новый элемент управления формы со значением selectedFile.

В обоих журналах консоли показан правильный объект изображения, но когда они попадают в nodejs v8.11.1, они выглядят пустыми.

Я также попытался создать форму HTML5 по умолчаниюобъект данных (с именем fd) и отправьте его на тот же сервис. Это также выглядит пустым

  imageUploadSubmitted(){
    let input = this.imageUpload.controls.imageInput as any;        
    input.value = this.selectedFile;  
    this.imageUpload.addControl('newImage', new FormControl(this.selectedFile));
    console.log('imageInput value = ',this.imageUpload.controls.imageInput.value);
    console.log('newImage value = ',this.imageUpload.controls.newImage.value);    
    //const fd = new FormData();
    //fd.append('image', this.selectedFile, this.selectedFile.name);
    this.mapcmsService.uploadImage(this.imageUpload.value).subscribe((data) =>{
      if(data.success){                  
        alert('ok');
      }
      else{
        alert('nope');
      }
    })
  }

Это мой сервис

  uploadImage(data){
    let headers = new Headers();
    headers.append('Content-Type','application/json');
    headers.append('Authorization',this.cma_token);
    return this.http.post('http://localhost:3000/cms/map/upload/image', data, {headers:headers}).pipe(map(res => res.json()));
  }

И это мой код узла, где я хотел бы использовать грозный, но я неесть значения для работы, поэтому я получаю сообщение об ошибке, что path не определено, так как нет значения

router.post('/upload/image',validate.required(),(req, res)=>{ 
  console.log('FILES - ',req.body);//<< all files appear empty

  let oldpath;
  let newpath;
  let textDate = String(Date.now());
  let newname ;
  let type;
  const form = new formidable.IncomingForm();
  form.parse(req, function (err, fields, files) {    

    oldpath = files.imageInput.path;//ofcourse gives an error and crash node
    newpath = path.join(__dirname, '/angular-src/src/app/assets/images/',newname) ;
    newname = textDate+files.imageInput.name;
    type = files.imageInput.type;
  });

});

Этот маршрут имеет промежуточное ПО validate, которое проверяет токен пользователя.Пользовательский токен установлен в заголовках, в сервисе.

Итак, во внешнем интерфейсе значения файла выглядят нормально, но я не получаю значений на сервере.Мой интерфейс выглядит хорошо для меня, и код сервера основан на потрясающем примере.

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

Спасибо

1 Ответ

0 голосов
/ 23 сентября 2018

Как вы упомянули:

//const fd = new FormData();

//fd.append('image', this.selectedFile, this.selectedFile.name);

Данные вашего запроса должны быть FormData, как ожидает ваш сервери это должно работать.если нет - укажите часть кода на стороне сервера и увидите.

А не могли бы вы предоставить образец plnkr или stackblitz?не уверен, что именно вы проходите через POST запрос

...