2017-06-11 7 views
0

Ich möchte Bilder von meiner App (iOS und Android) an meinen Server senden. Mein Code funktioniert mit kleinen Bildern, aber wenn die Größe zu groß ist, passiert nichts, wenn ich die Daten sende, und die Anwendung verlangsamt sich. Können Sie mir die Probleme in meinem Code erläutern und wie Sie diese beheben können? Vielen Dank :)Titanium - Bild an Server senden: Dateigröße Bug

Hier ist mein Code:

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

}); 

ich den unnötigen Code entfernt, weil es zu lange war! :)

+0

Müssen Sie base64-Dateien senden? Vielleicht hat die Größe der Anfrage die maximale Länge überschritten. Die req-Variable wäre interessant zu sehen, weil Sie nichts über das Setup zeigen – miga

+0

Verwenden Sie .NET Web API für Ihr Backend. Ich hatte ein ähnliches Problem. – Newport99

+0

Ich habe es nicht geschafft, meine Dateien anders als mit base64-Kodierung hochzuladen. In meinen Post-Feldern sende ich: 'medias': JSON.stringify (attached_media). Und mein Back-End ist in PHP. Aber die Image Factory-Lösung funktioniert, also denke ich, ich werde es behalten :) –

Antwort

1

Was ich aus den bereitgestellten Informationen verstehen konnte, ist, dass Sie Probleme beim Hochladen von großen Bildern haben, wie das von der Kamera, die sich als mehr als 2-3MB herausstellt.

Die einzige Lösung gegenwärtig ich Ihnen vorschlagen kann, ist das Bild mit dieser iOS-Android-Modul Ti-ImageFactory vor dem Speichern oder dem Senden an Server zu komprimieren.

Ich empfehle das Bild zu komprimieren rechts, nachdem Sie es in die Kamera Erfolg Callback wie folgt erfasst:

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

Added-Code - Wenn erfasst Bildgröße mehr als 3 MB ist, komprimieren sie dann um 0,5 Ebene, sonst komprimieren Sie es mit Standard-Level 0.7. Überprüfen Sie auch die ursprüngliche Bildgröße & komprimierte Bildgröße, um bessere Ergebnisse gemäß den Anforderungen der App für schnelleres Hochladen zu entsprechen.

Sie können auch eine Komprimierungsstufe in der Methode compress() übergeben. Weitere Informationen finden Sie in der Dokumentation.

+0

Noch einmal, vielen Dank @ Prashant, funktioniert Ihre Lösung gut :) –

+0

Diese Lösung hat für jetzt funktioniert, aber denken Sie daran, dass es könnte In den Fällen, in denen selbst nach der Komprimierung des Bildes, die Server-Akzeptanzrate groß ist. Suchen Sie daher auch nach Servereinstellungen, um zu verhindern, dass größere Bilder entstehen, oder dass die Verbindung beim Senden großer Bilder unterbrochen wird. Last but not least können Sie die Bildgröße im Callback überprüfen, um verschiedene Komprimierungsstufen für größere Bilder zu übergeben. Ich habe weiteren Code in der obigen Antwort für verschiedene Komprimierungsstufen hinzugefügt. –