Получить изображение после его загрузки, используя угол и узел - PullRequest
0 голосов
/ 29 сентября 2018

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

Сценарий заключается в отправке формы, сохранении изображения и текстовых полей формы, а затем обновлении фотогалереи новым изображением.Для фотогалереи я использую ng карусель .

Это код в интерфейсе

<form [formGroup]="myForm" (ngSubmit)="submitForm($event.target)" >
  <input type="file" (change)='imageChange($event)' formControlName="imageInput" name = 'imageInput'> 
  <input type="text" formControlName="imageName" name='imageName'>
  <button type="submit" >Submit</button>  
</form>

сохранить его как

  submitForm(form){
    let formData = new FormData(form);
    this.http.post('http://localhost:3000/cms/upload',formData,{reportProgress:true,observe:'events'}).subscribe(
      event=>{
        if(event.type === HttpEventType.Response){     
          eb = event.body;              
            this.addpic(eb.data);            
        }        
    }); 
}

eb.data содержит данные, полученные с сервера, после успешного сохраненияданные формы, идентификатор нового изображения и имя его файла.

В addpic Я пытаюсь добавить новое изображение в карусель.Добавьте все новые данные в массив, чтобы я мог позже использовать этот массив, ngFor создать его и динамически создать ng Карусель

  addpic(data){  
    this.images.push({
      'id': data.id,
      'name': data.name
     });
  }

, использовать его так, как

<ngb-carousel #carousel *ngIf="images" > 
  <ng-template ngbSlide *ngFor="let im of images; let i = index"  id="{{im.id}}">
    <img src='../assets/images{{im.newName}}' >
  </ng-template>
</ngb-carousel>

Так что это прекрасно работает, но изображение никогда не отображается.Я не получаю ошибок, я вижу все данные, сохраненные в моей базе данных, изображение передается в папку, как и должно быть, но нет нового изображения в карусели, просто ошибка 404 в консоли.Массив images обновлен, но в карусели нет изображения.URL в порядке, все остальные изображения с таким же URL отображаются в карусели.Как будто приложение не успело увидеть все обновление, поэтому оно не может показать изображение.

Я попытался извлечь объект файла изображения из формы, сохранить его в угловом формате в selectedFile: File; и использовать его в карусели, но в нем нет path или чего-либо подобного.Возьмите его, когда он установлен в форме

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

, и используйте его в addpic

  addpic(data){  
    this.images.push({
      'id': data.id,
      'name': this.selectedFile.path
     });
  }

Я также пытался использовать formData перед отправкой формы, чтобы получитьизображение, но результат тот же, объект без пути.

Я также пытался «прочитать» файл, используя HTML5 FileReader, но это изображение, и в карусели мне нужно предоставить URL для src, а не только файл изображения.

Я также использовал formidable в узле, чтобы проанализировать форму и взять путь к изображению, вернуть его обратно во внешний интерфейс вместе с идентификатором и именем файла и использовать его в качестве src.Но это не будет использоваться браузером по соображениям безопасности, потому что это URL в временных файлах.

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

вот так

  addpic(data){
    this.getImages(this.currentId); //get all images again   
     this.images.push({
      'id': this.images.id,
      'name': this.images.path
     }); 
  }

Мне нужно обновить страницу для показа изображения.Я не знаю, как это исправить.Есть идеи?Это проблема безопасности, из-за которой я не могу сразу получить изображение, даже если оно сохранено и мне нужно обновить его?Я хотел бы избежать выполнения дополнительных get, если это возможно, чтобы поддерживать минимальное взаимодействие между клиентом и сервером.

Я использую angular6 и узел 8.11.в windows 10 все локально в моем ноутбуке.

Спасибо

1 Ответ

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

Возможно, проблема связана с обновленной переменной, ссылающейся на ту же ссылку.внутри addPic ().добавить эту строку кода в качестве последней строки.

this.images = this.images.slice(); 
...