2012-04-10 11 views
3

EinführungiOS - Streaming große Dateien zum Upload (Anwendung abstürzt, wenn zu große Dateien Zuweisung NSData verwenden)

Ich bin derzeit in einer Anwendung einig Bug-Fixes zu tun, die im Stil von Vimeo ist, das heißt, Der Benutzer kann Videos vom Telefon oder iPad aufzeichnen und dann das Video hochladen, damit andere Benutzer es sehen können. Das aktuelle Problem hat mit dem Hochladen großer Dateien zu tun, da wir gerade mit dem Upload umgehen.

Das Problem

Das Problem ist also im Wesentlichen, dass, wenn Dateien auf den Server hochladen, wir alle Bytes zuerst vergeben, die in einem NSData Objekt hochgeladen werden muss. Diese Bytefolge wird dann an eine standardmäßige HTTP-Post-Nachricht angehängt, und eine empfangende API wird sie dann verarbeiten. Das Problem ist, dass bei großen Dateigrößen (die schnell in Videos angezeigt werden) die App einfach abstürzt, weil das NSData-Objekt zu viel Speicher auf dem iDevice belegt.

Dies ist, wie der Prozess funktioniert:

Byte *buffer = malloc(content.defaultRepresentation.size); 

    NSUInteger buffered = [content.defaultRepresentation getBytes:buffer fromOffset:0.0 length:content.defaultRepresentation.size error:nil]; 

    NSData *data = [NSData dataWithBytesNoCopy:buffer length:buffered]; 

    NSData *movieData = [NSData dataWithData:data]; 

ich einfach das Bytes aus einem Video erhalten, die in den iPhone oder iPad Standard-Kamera-Rolle gesichert wurde. Dann lege ich diese Bytes in ein NSData-Objekt. Die Bytefolge aus diesem NSData-Objekt wird dann einfach an eine einfache HTTP-Nachricht angehängt und an eine API gesendet.

Die Frage

Die Frage ist dann, und das Problem, das ich sehe, ist, dass der gesamte Byte-String in einer einzelnen HTTP-Nachricht senden zu haben. Gibt es also eine Möglichkeit, die Filmdatei in Chunks zu laden und sie an die Post-Nachricht anzuhängen, damit Sie nicht zu viel Speicher gleichzeitig verbrauchen? Oder wie konntest du das tun?

Vielen Dank für Ihre Zeit :)

Antwort

2

Ich würde vorschlagen, Sie ASIHTTPRequest Bibliothek zu verwenden. Es kann Dateien direkt vom Telefon hochladen, anstatt die Datei zuerst in den Speicher zu laden. Die Logik hier ist, die Filmdatei hochzuladen, indem sie in Teile zerlegt wird, multiparts genannt, und dann in die Warteschlange hochlädt.

+1

Ah ja, ich schaute um auf der Website und habe es installiert und kompiliert :) Jetzt ist mein einziges Problem, dass die ASIHTTPRequest-Bibliothek akzeptiert eine Zeichenfolge URL zu der Datei (wenn Sie es an eine POST-Anfrage anhängen wollen), aber ich konnte noch nicht erfolgreich zeigen Sie erfolgreich auf Daten durch seine URL, wenn es durch die ALAsset-Klasse ist (da die Datei außerhalb der Anwendung in der Kamera liegt). Ist es überhaupt möglich, auf Dateipfade außerhalb der Sandbox der Anwendung zuzugreifen? Gibt es eine Möglichkeit, dieses Problem zu umgehen? Zum Beispiel ergibt dies als schnelles Beispiel – CodingBeagle

+0

ein NS-Datenobjekt mit einer Länge von 0 Bytes: NSData * testData = [NSData dataWithContentsOfURL: theContent.defaultRepresentation.url]; – CodingBeagle