2016-11-02 4 views
1

Я пытаюсь прочитать файл изображения и изменить его размер и загрузить его в Ionic2 на Android. Мой код работает для изображений небольшого размера, но для изображений с более чем 3 Мбайт функция onloaded никогда не вызывается.Изображение файла onloaded не вызывается после вызова readAsDataURL на больших изображениях

Я действительно ценю любую помощь или понимание относительно того, почему.

makeFileIntoBlob(_imagePath) { 


    return new Promise((resolve, reject) => { 
     window.resolveLocalFileSystemURL(_imagePath, fileEntry => { 

      fileEntry.file(file => { 

       var reader = new FileReader(); 

       console.log('Reading the file!'); 

       reader.onloadend = (e: any) => { 

        var img = document.createElement("img"); 


        img.onload =() => { 
         //---> Only get here for small images! 
         var resizedImg = this.imgResizerSrvc.resize(img, 480, 480); 
         var imgBlob: any = this.dataURLtoBlob(resizedImg); 
         imgBlob.name = 'sample.jpg'; 
         console.log('makeFileIntoBlob resolved!'); 
         resolve(imgBlob); 
        } 

        //Will trigger img.onloadend 
        alert("about to trigger"); 
        img.src = e.target.result; //----> This call only triggeres reader.onloadend for small images 
        alert("Done trigger"); 

       }; 

       reader.readAsDataURL(file); 

      }); 
     }); 
    }); 

}

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

img.src = (window.URL ? URL : window.webkitURL).createObjectURL(file); 

или

img.src = (window.URL || window.webkitURL || window || {}).createObjectURL(file); 

, но ни один из них не триггером img.onloaded().

+0

Что делает '.dataURLtoBlob'? Что делает 'this.imgResizerSrvc.resize (img, 480, 480),' return? Может существовать ограничение на '.length'' URI данных '. Использует ли '.this' элемент' .onload' 'img'? – guest271314

+0

Они предназначены для изменения размера и преобразования в blob. Моя проблема прямо сейчас заключается в том, что я даже не добираюсь до тех функций, которые вызывают, поэтому проблема не должна быть там. Этот код является функцией-членом компонента в ionic2, поэтому я ожидал, что '.this' ссылается на этот компонент. Но опять же, моя проблема заключается в том, что 'img.onload' даже не вызван. – Ari

+0

'' '' '' '' событие 'img'' '' 'будет' 'элемент. Может существовать ограничение на '.length'' URI данных '. Вы можете использовать 'Blob' вместо' data URI'. 'file' - это объект' File', да? – guest271314

ответ

1

Там может быть ограничение на .length из data URI

ограничения длины

Хотя Firefox поддерживает идентификаторы URI данных по существу неограниченной длины, браузеры не требуется поддерживать какой-либо конкретной максимум длина данных. Например, браузер Opera 11 ограниченными данными URI составляет около 65000 символов.

Вы можете использовать URL.createObjectURL() призвал file, без использования FileReader(), передать Blob созданный .imgResizerSrvc.resize для File() установить .name от создания File объекта.

makeFileIntoBlob(_imagePath) { 

    return new Promise((resolve, reject) => { 
    window.resolveLocalFileSystemURL(_imagePath, fileEntry => { 

     fileEntry.file(file => { 

     var component = /* reference to ionic2 component */ ; 

     var img = document.createElement("img"); 

     img.onload =() => { 

      var resizedImg = component.imgResizerSrvc.resize(this, 480, 480); 
      var imgBlob = new File([resizedImg], "sample.jpg", { 
      type: "image/jpeg" 
      }); 
      resolve(imgBlob); 

     }; 

     img.src = URL.createObjectURL(file); 
     }); 
    }); 
    }); 
} 
+0

Большое спасибо за ваш ответ. Я пробовал ваш код, но мой код разбивается на эту строку: img.src = URL.createObjectURL (файл); Это происходит с любым размером изображения. Я сделал некоторые исследования, другие предложенные способы не работают либо: 'img.src = (window.URL URL: window.webkitURL) .createObjectURL (файл);' или 'img.src = (window.URL || window.webkitURL || window || {}). createObjectURL (файл); ' Любые идеи, что я делаю? – Ari

+0

Что такое 'файл'? – guest271314

+0

От моего понимания это просто объект, который возвращается window.resolveLocalFileSystemURL. Я взял свой код здесь: https://github.com/aaronksaunders/firebaseStorage2/blob/master/app/pages/home/home.ts – Ari

Смежные вопросы