Beschreibung: Ich muss eine Base 64 codierte Zeichenfolge in einem HTTP-POST-Parameter senden, der eine Datei darstellt, die hochgeladen werden soll.
Aktuelle Methode: Ich verwende einen ASIFormDataRequest und kodiere meine Datei in eine base64-Zeichenfolge wie folgt:
%Vor%Allerdings hat die App beim Hochladen von großen Dateien keinen Speicher mehr und stirbt einen schrecklichen Tod!
Vorgeschlagene Lösung: Würde jemand jetzt sagen, wie ich die Datei von Festplatte lesen, sie in base64-Strings in Chunks konvertieren und die konvertierte base64-Strings an einen Parameter in der HTTP-Anfrage anhängen würde ?
Effektiv jede Art, die das Lesen der ganzen Datei in den Speicher vermeidet.
Jede Eingabe würde sehr geschätzt werden!
Mein http-Anforderungscode vollständig:
%Vor%Ich würde dieses Problem in zwei teilen:
1. Codieren Sie große Dateien in Blöcken in Base64
2. Laden Sie diese Datei hoch
1. Codieren Sie große Dateien in Blöcken in Base64:
Suchen Sie nach Code, der NSData
-Instanzen in Base64 codiert. Verwenden Sie dann ein NSInputStream
, um Daten in Blöcken zu lesen, zu codieren und NSOutputStream
zu verwenden, um in eine temporäre Datei zu schreiben. Ich habe diese Frage / Antwort gefunden: Ist es möglich, Base64 -eine Datei in Chunks codieren? Machen Sie die Chunk-Größe ein Vielfaches von 3 und es sollte funktionieren. Vielleicht möchten Sie dies in den Hintergrundthread verschieben.
Wichtig: Dadurch wird eine temporäre Datei erstellt, die größer als das Original ist. Es muss für diesen Moment genügend Speicherplatz auf dem Gerät vorhanden sein. Nach dem Hochladen können Sie es löschen.
2. Laden Sie diese Datei hoch
Es scheint, dass Sie dies bereits getan haben. Sie können ASIFormDataRequest
genau wie in Ihrem Beispiel verwenden. Und da es eine private Kopie der Datei erstellt (es erstellt die mehrteilige POST-Datei), können Sie Ihre Kopie löschen.
Wenn Sie sie optimieren möchten, indem Sie diese Schritte parallelisieren, müssen Sie eine andere Möglichkeit finden, die mehrteilige Datei hochzuladen.
Anstatt die Datei in einem Treffer zu lesen, müssen Sie sie in Blöcken lesen
Sie können dazu einen Eingabestream verwenden Apple hat einige Informationen zu hier
Grundsätzlich müssen Sie einen NSInputStream erstellen, der auf Ihre Datei zeigt, wie im Beispiel
%Vor%Sie können die Daten dann in Blöcken mit der NStreamDelegate-Methode lesen - (void) stream: (NStream *) stream handleEvent: (NStreamEvent) eventCode
Wieder geben Apple ein Beispiel dafür
%Vor%Die Größe der Chunks, die Sie auswählen, muss ein Gleichgewicht zwischen Speicherleistung und Netzwerkleistung sein, da offensichtlich ein Overhead mit den HTTP-Headern besteht
Sie können auch weiter optimieren, indem Sie Ihre NSData direkt senden (und somit den base64-Overhead speichern), um diesen Beitrag zu lesen