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

Я новичок в JS и React.Я использую React, и у меня есть несколько файлов ввода в форме, я хотел бы, чтобы пользователь выбирал изображение, размеры изображений должны быть изменены и предварительно просмотр, прежде чем пользователь нажимает кнопку загрузки.Теперь с изменением размера, предварительным просмотром и загрузкой все в порядке, проблема в том, что когда я изменяю входные данные файла, другие входные данные предварительного просмотра и загрузки файлов изменяются синхронно!любая помощь будет оценена.

Это код:

render ():

render(){
  return(
    ...
    <label>Image1
    <input type="file" id="img1" on Change={this.handleChange} />
    </label>
    <br/>
    <img id="img1_preview" src="" height="100" />
    <label>Image2
    <input type="file" id="img2" on Change={this.handleChange} />
    </label>
    <img id="img2_preview" src="" height="100" />
    ...
  )
}

function ():

...
handleChange(event) {
  ...
  /* handle all image input change */
  if (event.target.id.includes('img')) {
    var field = event.target.id;
    var preview = document.getElementById(field + '_preview');
    var file = event.target.files[0];
    var reader = new FileReader();
    reader.onload = function(readerEvent) {
      var image = new Image();
      image.onload = function(imageEvent) {
        var canvas = document.createElement('canvas');
        var max_size = 800; /* max size */
        var width = image.width, height = image.height;
        if (width > height) {
          if (width > max_size) {
            height *= max_size / width;
            width = max_size;
          }
        } else {
          if (height > max_size) {
            width *= max_size / height;
            height = max_size;
          }
        }
        canvas.width = width;
        canvas.height = height;
        canvas.getContext('2d').drawImage(image, 0, 0, width, height);
        var dataUrl = canvas.toDataURL('image/jpeg');
        /* Utility function to convert a canvas to a BLOB */
        var dataURLToBlob = function(dataURL) {
          var BASE64_MARKER = ';base64,';
          if (dataURL.indexOf(BASE64_MARKER) === -1) {
            var parts = dataURL.split(',');
            var contentType = parts[0].split(':')[-1];
            var raw = parts[1];
            return new Blob([raw],{type:contentType});
          }
          var parts = dataURL.split(BASE64_MARKER);
          var contentType = parts[0].split(':')[1];
          var raw = window.atob(parts[1]);
          var rawLength = raw.length;
          var uInt8Array = new Uint8Array(rawLength);
          for (var i = 0; i < rawLength; ++i) {
            uInt8Array[i] = raw.charCodeAt(i);
          }
          return new Blob([uInt8Array],{type:contentType});
        }
        /* End Utility function to convert a canvas to a BLOB */
        var resizedImage = dataURLToBlob(dataUrl);
        $.event.trigger({
          type: "imageResized",
          blob: resizedImage, 
          url: dataUrl
        });
      }
      image.src = readerEvent.target.result;
    }
    reader.readAsDataURL(file);
    $(document).on("imageResized",function(event1){
      if (event1.blob && event1.url) {
        var blob = event1.blob, url = event1.url;
        # set state, later will be submit to server
        this.setState({[field]:blob}); 
        /* preview */
        var reader1 = new FileReader();
        reader1.addEventListener("load",function(){
          preview.src = url;
        }, false);
        reader1.readAsDataURL(blob);
        /* end preview */
      }
    })
  }

theстраница: изображение страницы

1 Ответ

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

спасибо @Kaiido, согласно его совету, проблема была решена (хотя я не знаю точной причины).

это рабочий код:

...
handleChange(event) {
  ...
  /* handle all image input change */
  if (event.target.id.includes('img')) {
      var field = event.target.id;
      var preview = document.getElementById(field + '_preview');
      var file = event.target.files[0];
      var reader = new FileReader();
      reader.onload = function(readerEvent) {
      var image = new Image();
      image.onload = function(imageEvent) {
          var canvas = document.createElement('canvas');
          var max_size = 800; /* max size */
          var width = image.width, height = image.height;
          if (width > height) {
              if (width > max_size) {
                  height *= max_size / width;
                  width = max_size;
              }
          } else {
              if (height > max_size) {
                  width *= max_size / height;
                  height = max_size;
              }
          }
          canvas.width = width;
          canvas.height = height;
          canvas.getContext('2d').drawImage(image, 0, 0, width, height);
          var dataUrl = canvas.toDataURL('image/jpeg');
          /* changed code */
          canvas.toBlob(function(blob){
              this.setState({[field]:blob});
              var reader1 = new FileReader();
              reader1.addEventListener("load",function(){
                  preview.src = dataUrl;
              }, false);
              reader1.readAsDataURL(blob);
          });
          /* end changed */
      }
      image.src = readerEvent.target.result;
    }
    reader.readAsDataURL(file);
  }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...