Обрезка изображения с помощью cropperJS в Angular не отправляет обрезанное изображение в серверную часть

#javascript #angular #typescript #cropperjs

#javascript #угловатый #машинописный текст #cropperjs

Вопрос:

Итак, я сталкиваюсь с ошибкой, из-за которой он не отправляет обрезанное изображение на серверную часть с помощью multer.

Я могу загрузить файл во внешний интерфейс, а затем обрезать изображение, но обрезанное изображение не отправляется в серверную часть, но это загруженный img, отправленный на серверную часть.

Я использую версию cropper.js at Angular 11 с модулем, который кто-то разработал для Angular.

это cropper.js https://fengyuanchen.github.io/cropperjs / И это модуль https://github.com/matheusdavidson/angular-cropperjs

Итак, моя идея такова. Загрузите фотографию -> обрезайте ее и сохраните в папке на серверной части. Сохранение работает, но оно сохраняет img по умолчанию, а не обрезанный img. Когда пользователь использует событие click для сохранения изображения, возьмите обрезанное изображение и сохраните его в серверной части.

Это мой пользовательский интерфейс и методы.

 <angular-cropper #angularCropper
[cropperOptions]="imgConfig"
 [imageUrl]="imgUrl | safeurl"></angular-cropper>

 <div class="btn-group">
      <label class="btn btn-primary btn-upload" for="inputImage" title="Upload image file" >
        <input type="file" class="sr-only" id="inputImage" name="file" accept="image/*" (change)="fileChangeEvent($event)">
        <span class="docs-tooltip" data-toggle="tooltip" title="" data-original-title="Import image with Blob URLs">
          <span class="fa fa-upload"></span>
        </span>
      </label>
    </div>



<button type="button" class="btn btn-primary" data-method="crop" title="Crop" (click)="saveImage()">
            <span class="docs-tooltip" data-toggle="tooltip" title="" data-original-title="cropper.crop()">
              <span class="fa fa-check"></span>
            </span>
          </button>
 

TS-файл

 imgUrl;
imageURL;
imageCrop;


@ViewChild("angularCropper", {static: false}) public angularCropper: CropperComponent;
public imgConfig = {
  aspectRatio : 3/4,
  dragMode : "move",
  background : true,
  movable: true,
  rotatable : true,
  scalable: true,
  zoomable: true,
  viewMode: 1,
  checkImageOrigin : true,
  checkCrossOrigin: true,
  width: 0,
  height: 0,
};
  fileChangeEvent(event: any): void {
     this.imgUrl = URL.createObjectURL(event.target.files[0]);
     this.imageCrop = event.target.files[0];
  }

saveImage() {

this.angularCropper.cropper.crop();
  this.imageService.addImage(this.imageCrop).subscribe((res: any) => {
    if (res.body) {
     this.imageService.getImageByID(res.body._id).subscribe((t: Image) => {
      this.imageURL = t.imageUrl;
      console.log(this.imageURL);
     });
    }
  }, (err: any) => {
    console.log(err);
  });
}
 

И это мой сервис

 @Injectable({
  providedIn: "root"
})
export class ImageService {
   apiUrl = environment.backend;

  constructor(private http: HttpClient) { }


  addImage(file: File): Observable<any> {
    const formData = new FormData();
    formData.append("file", file);
    const header = new HttpHeaders();
    const params = new HttpParams();

    const options = {
      params,
      reportProgress: true,
      headers: header
    };
    const req = new HttpRequest("POST", `${this.apiUrl}/images/${file.name}`, formData, options);
    return this.http.request(req);
  }
  getImageByID(id: string): Observable<any> {
    const url = `${this.apiUrl}/${id}`;
    return this.http.get<Image>(url).pipe(
    catchError(this.handleError)
    );
    }
  private handleError(error: HttpErrorResponse): any {
    if (error.error instanceof ErrorEvent) {
      console.error('An error occurred:', error.error.message);
    } else {
      console.error(
        `Backend returned code ${error.status}, `  
        `body was: ${error.error}`);
    }
    return throwError(
      'Something bad happened; please try again later.');
  }

}
 

Ответ №1:

вы получите обрезанное изображение из выходных данных компонента cropper.. экспорт — это имя вывода