モバイル端末H 5ピクチャにアップロードされたこれらのピット
4072 ワード
先週はモバイル端末の画像を圧縮してアップロードする機能を作りました.いくつかのピットを踏んで、ここでまとめます.
大体の考えは、一部のAPIの互換性はcaniuseを参照してください.は、FileReaderを利用して、 は は を得る.ファイルをアップロードします. ステップ1では、ピクチャの圧縮を行う前に、または画像のサイズを判断しました.画像のサイズが200 KBより大きい場合は、直接に画像のアップロードを行い、画像の圧縮を行いません.画像のサイズが200 KBより大きい場合は、先に画像の圧縮を行ってからアップロードします.携帯を縦に持つと、写真を撮ってアップロードすると、自動的に写真が回転します.横で写真を撮って写真をアップロードすると、この問題が発生しません.このとき、ピクチャの自動回転を訂正したい場合は、ピクチャをバイナリデータ を押してください.は、 を押してください. FileReaderを利用して、画像を読み取る過程は一定の時間がかかり、canvasキャンバスに画像データを注入するには一定の時間が必要です.画像圧縮の過程で、画像が大きいほど、CPU計算による消費時間も長くなり、トンカードが発生する可能性があります.つまり、この過程では時間がかかります. IOS 8.1のバージョンに を押してください.
ステップ4、ファイルアップロードには2つの方法があります.は、写真をbase 64 に変換する.画像データをBlobオブジェクトに変換し、FormDataを使ってファイルをアップロードする .
方式1はxhr ajaxまたはxhr 2 FormDataで提出できます.
方法2ここに大きな穴があります.具体的な説明は私を突いてください.
簡単に言えば、
画像の
2月19日更新
Androidマシンの中で、一部
2月22日に更新します
パッケージされたgithubライブラリを押してください.文章がいいと思ったら、あなたのスターをけちけちしないでください.
大体の考えは、一部のAPIの互換性はcaniuseを参照してください.
blob
を読み取るか、またはfile
を利用して、画像をdata uri
の形式に変換する.canvas
を使用して、ページにキャンバスを新設し、canvas
から提供されたAPIを利用して、このキャンバスの中に絵を描きます.canvas.toDataURL()
を利用して、ピクチャの圧縮を行い、画像のdata uri
の値
var fileChooser = document.getElementById("choose"),
maxSize = 200 * 1024; //200KB
fileChoose.change = function() {
var file = this.files[0], //
reader = new FileReader();
reader.onload = function() {
var result = this.result, //result data url
img = new Image(),
img.src = result;
if(result.length < maxSize) {
imgUpload(result); //
} else {
var data = compress(img); //
imgUpload(data); //
}
}
reader.readAsDataURL(file);
}
ステップ2、3: var canvas = document.createElement('canvas'),
ctx = canvas.getContext('2d');
function compress(img) {
canvas.width = img.width;
canvas.height = img.height;
// canvas
// 0.2 。
var data = canvas.toDataURL('image/jpeg', 0.2); //data url
return data;
}
canvasを利用して絵を描く過程で、IOS画像をアップロードする過程において、このような問題が存在する:( binaryajax.js)
に変換し、ピクチャのexif
を容易に取得し、exif
を取得することによって、ピクチャの回転角度( exif.js)
を決定し、ピクチャに対応する回転処理を行う.解決方法を教えてください.IOS
において、ピクチャのサイズが2 MBより大きい場合、ピクチャが潰される場合があり、この場合、ピクチャの割合をリセットする必要がある.解決方法を教えてください.FileReader
のバグがあります.FileReader
で読み取った画像がBase 64に変換された時、文字列が空です.具体的な問題の説明はステップ4、ファイルアップロードには2つの方法があります.
方式1はxhr ajaxまたはxhr 2 FormDataで提出できます.
方法2ここに大きな穴があります.具体的な説明は私を突いてください.
簡単に言えば、
Blob
はFormData
に注入できません.画像の
data uri
を手に入れたら、Blob
データタイプに変換します. var ndata = compress(img);
ndata = window.atob(ndata); // base64
// buffer ,
var buffer = new Uint8Array(ndata.length);
for(var i = 0; i < text.length; i++) {
buffer[i] = ndata.charCodeAt(i);
}
// buffer Blob
var blob = getBlob([buffer]);
var fd = new FormData(),
xhr = new XMLHttpRequest();
fd.append('file', blob);
xhr.open('post', url);
xhr.onreadystatechange = function() {
//do something
}
xhr.send(fd);
Blob
の新規作成には互換性のある処理が必要であり、特にFormData
のアップロードをサポートしていないandriodマシンの互換性処理が必要である.具体的な方法は私の主な実現の詳細を突いてください.HTTP要求を書き換えることによってです.2月19日更新
Androidマシンの中で、一部
blob
の機種は4.x
の中でwebview
の対象を去勢しました.たとえば、file
の値が取れないです.2月22日に更新します
file.type
の下でAndroid4.4
は、システム
のWebView
インターフェースが変更されたため、ファイルが選択できなくなり、ファイルをアップロードできなくなりました.パッケージされたgithubライブラリを押してください.文章がいいと思ったら、あなたのスターをけちけちしないでください.