0

最近、ブラウザのjavascriptからAmazonS3への画像アップロードを実装しました。私はFireFox、Chrome、IEのみに焦点を当ててきました。

結局、私はそれをIEに実装することができませんでした-どのバージョン(10でも)。

ユースケースは次のようなものでした。

  1. ローカル画像ファイルを選択します
  2. ファイルサイズ、MIMEコンテンツタイプ、ファイル名をクラウド内のサーバーに送信します。
  3. 画像ファイルからbase64サムネイルを作成する
  4. クラウド内のサーバーが署名を行い、アップロード用のすべての重要なデータとURLを送信します
  5. データを取得し、xhr:XMLHttpRequestオブジェクトを形成します
  6. 「POST」メソッドを使用して、提供されたデータ(acl、key、Content-Type、AWSAccessKey、signature、policy、file)も使用して、「multipart/form-data」リクエストでファイルをアップロードします。

もう1つの重要なことは、ブラウザのロケーションプロトコルがhttpsであるということです。

問題: 主にIEでいくつかの問題が発生しました。

  1. IE <10では、ファイルのサイズ、mimeタイプ、またはローカルパスを読み取ることはできません。
  2. IE <10は、base64作成用のローカルファイルコンテンツを読み取ることができません。
  3. IE 10はそのようなこと(1と2)を実行できますが、xhr.open( "POST"、url、true)に問題があります-URLがhttp://で始まるとクラッシュします(ブラウザーはhttps://somethingから呼び出します) .com / more / stuff

    3.1。ブラウザがhttp上にある場合、それは機能します。

    3.2。https://で始まるURLに対してPOSTリクエストが呼び出された場合、クラッシュは発生しませんが、3.2.1のアップロードに失敗します。3.2と同じことがFireFoxで起こっています

受け入れられない解決策:

  1. ブラウザとリンク先URLがhttp://で始まる場合、すべてが機能します
  2. フラッシュプラグインを使用する

ソリューションが古いブラウザをサポートする場合は本当に、本当に良いでしょう。IE9+をサポートする場合は非常に良いでしょう。そして、IE10だけをサポートする場合はOKです。もちろん、FFとChromeもそれで動作するはずです。

これは機能するコードの一部ですが、問題があります(問題3):

function sendFile(putFields){
var xhr = new getXHRObject(); // returns new XMLHttpRequest object.
var url = 'http://'+putFields.bucket+"."+putFields.host+"/";
xhr.onreadystatechange=function(){
   if (http.readyState==4&&null!=http.status&&(http.status==200||http.status==201
        ||http.status==202||http.status==204||http.status==205||http.status==0)){
        alert('success!');
    }else if (http.readyState==4){
        alert('fail ');
    }
}

 var params={
        'acl':""+putFields.acl,
        'key':""+putFields.key,
        'Content-Type':putFields.contentType,
        'AWSAccessKeyId':putFields.awsAccessKeyId,
        'signature':putFields.signature,//encodeURIComponent()
        'policy':""+putFields.policy,
        'file':aFile
 };
 var fData = new FormData();

 for (var p in params)
     fData.append(p,params[p]);

xhr.open("POST", postUrl, true); // IE crashes here when https-->http is the case
setTimeout(function(){ xhr.send(fData);}, 100);
}

私はしばらくの間これの解決策を見つけようとしていますが、本当の成功はありません、助けてください!

4

1 に答える 1