2017-06-11 31 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。 但圖像工廠解決方案的工作原理,所以我想我會保持它:) –

回答

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] 
    }); 
}); 

添加的代碼 - 如果拍攝的圖片大小超過3MB以上,然後用0.5壓縮它級別,否則使用默認級別0.7來壓縮它。同時檢查初始圖片大小&壓縮的圖片大小以匹配更好的結果,根據應用程序的要求更快地上傳。

您還可以在compress()方法中傳遞一個壓縮級別。請參閱文檔瞭解更多信息。

+0

再次,非常感謝@Prashant,您的解決方案運作良好:) –

+0

此解決方案已經工作了,但請記住,可能有甚至在壓縮圖像之後,它會根據您的服務器接受程度而變大。因此,請查找服務器設置,以便它不允許放大圖像,或者在發送大圖像時斷開連接。最後但並非最不重要的是,您可以檢查回調中的圖片大小,以便爲更大的圖片傳遞不同的壓縮級別。我在上面的答案中爲不同的壓縮級別添加了更多代碼。 –