2017-06-11 2 views
0

私のアプリ(iOSとAndroid)から自分のサーバーに画像を送信したいと思います。私のコードは小さな画像で動作しますが、サイズが大きすぎると、データを送信すると何も起こらず、アプリケーションが遅くなります。 私のコードの問題とそれを解決する方法を教えてください。どうもありがとう:)チタン - 画像をサーバーに送る:ファイルサイズの不具合

は、ここに私のコードです:

var attached_media = []; 
var file_btn = Ti.UI.createButton({ title: L('select') }); 

file_btn.addEventListener('click',function(e){ 
    Titanium.Media.showCamera({ 
     success:function(e) { 
      if(e.mediaType == Ti.Media.MEDIA_TYPE_PHOTO) { 
       attached_media.push(Ti.Utils.base64encode(e.media).text); 
      } 
     }, 
     saveToPhotoGallery:true, 
     allowEditing: false, 
     mediaTypes: [Ti.Media.MEDIA_TYPE_PHOTO] 
    }); 
}); 

var send_button = Titanium.UI.createButton({ 
    title: 'Send', 
}); 

send_button.addEventListener('click',function(e){ 

    var req = ...... 
    req.send({ 'medias':JSON.stringify(attached_media), 'user_id':Ti.App.Properties.getInt('user_id')}); 

}); 

それが長すぎたので、私は、不要なコードを削除しました! :)

+0

base64ファイルを送信する必要がありますか?要求サイズが最大長を超えた可能性があります。あなたが設定について何も表示しないので、req変数は面白いでしょう – miga

+0

バックエンドに.NET Web APIを使用していますか?私も同様の問題がありました。 – Newport99

+0

base64エンコーディング以外の方法でファイルをアップロードできませんでした。私のポストフィールドで、私は送信しています: 'medias':JSON.stringify(attached_media)。 私のバックエンドはPHPです。 Image Factoryソリューションは機能しているので、私はそれを保つつもりだと思います:) –

答えて

1

提供された情報からわかったことは、カメラのサイズが2〜3MBを超えるような大きなサイズの写真をアップロードする際に問題があることです。

唯一の解決策は、このiOS-AndroidモジュールTi-ImageFactoryを使用して画像を圧縮して保存することをお勧めします。

私はあなたがこのようにカメラの成功コールバックでそれを撮影した直後に画像を圧縮することをお勧めします:

file_btn.addEventListener('click',function(e){ 
    Titanium.Media.showCamera({ 
     success:function(e) { 
      if(e.mediaType == Ti.Media.MEDIA_TYPE_PHOTO) { 
       Ti.API.info("Initial pic bytes = " + e.media.length); 

       // if bytes length of pic is larger than 3MB or 3145728 bytes, set compression to 0.5, 
       // else keep it to default which is 0.7 
       var imf = require('ti.imagefactory'); 
       var compressedPic = (e.media.length > 3145728) ? imf.compress(0.5) : imf.compress(); 
       attached_media.push(Ti.Utils.base64encode(compressedPic).text); 

       Ti.API.info("Compressed pic bytes = " + compressedPic.length); 

       compressedPic = null; 
      } 
     }, 
     saveToPhotoGallery:true, 
     allowEditing: false, 
     mediaTypes: [Ti.Media.MEDIA_TYPE_PHOTO] 
    }); 
}); 

追加されたコード - キャプチャした画像のサイズが3メガバイト以上である場合には、0.5で、それを圧縮しますそれ以外の場合は、デフォルトのレベル0.7を使用して圧縮します。また、最初の画像サイズ&を圧縮した写真のサイズを確認すると、より高速なアップロードのためのアプリの要件に従って、より良い結果を得ることができます。

compress()メソッドで圧縮レベルを渡すこともできます。詳細については、docsを参照してください。

+0

もう一度、ありがとう@Prashant、あなたのソリューションはうまくいきます:) –

+0

このソリューションは今のところ働いていますが、イメージを圧縮した後であっても、サーバーの受け入れレベルに応じて大きくなります。また、大きな画像を送信できない、または大きな画像を送信している間に接続が切断されている理由についても、サーバー設定を探してください。最後に、大きな画像に対して異なる圧縮レベルを渡すために、コールバックの画像サイズを確認できます。私は、上記の答えに、さまざまな圧縮レベルのコードを追加しました。 –

関連する問題