Hochladen großer Bilder mit Base64 und JSON
Ich verwende diese Funktion, um ein Bild hochladen zu einem server mithilfe JSON
. Um dies zu tun, muss ich zuerst konvertieren Sie das Bild in NSData
und dann zu NSString
mit Base64
. Die Methode funktioniert gut, wenn das Bild nicht sehr groß, aber wenn ich versuche zum hochladen 2Mb Bild, stürzt es ab.
Das problem ist, dass der server nicht erhalten, mein Bild, obwohl die didReceiveResponse
- Methode aufgerufen wird, sowie die didReceiveData
gibt (null)
. Zuerst dachte ich, es war ein time-out Problem, aber auch die Einstellung 1000.0 es funktioniert immer noch nicht. Irgendeine Idee? Vielen Dank für Ihre Zeit!
Hier ist meine aktuelle code:
- (void) imageRequest {
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:@"http://www.myurltouploadimage.com/services/v1/upload.json"]];
NSString *docDir = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0];
NSString *path = [NSString stringWithFormat:@"%@/design%i.png",docDir, designNum];
NSLog(@"%@",path);
NSData *imageData = UIImagePNGRepresentation([UIImage imageWithContentsOfFile:path]);
[Base64 initialize];
NSString *imageString = [Base64 encode:imageData];
NSArray *keys = [NSArray arrayWithObjects:@"design",nil];
NSArray *objects = [NSArray arrayWithObjects:imageString,nil];
NSDictionary *jsonDictionary = [NSDictionary dictionaryWithObjects:objects forKeys:keys];
NSError *error;
NSData *jsonData = [NSJSONSerialization dataWithJSONObject:jsonDictionary options:kNilOptions error:&error];
[request setHTTPMethod:@"POST"];
[request setValue:[NSString stringWithFormat:@"%d",[jsonData length]] forHTTPHeaderField:@"Content-Length"];
[request setValue:@"application/json" forHTTPHeaderField:@"Accept"];
[request setValue:@"application/json" forHTTPHeaderField:@"Content-Type"];
[request setHTTPBody:jsonData];
[[NSURLConnection alloc] initWithRequest:request delegate:self];
NSLog(@"Image uploaded");
}
- (void) connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response {
NSLog(@"didReceiveResponse");
}
- (void) connection:(NSURLConnection *)connection didReceiveData:(NSData *)data {
NSLog(@"%@",[NSJSONSerialization JSONObjectWithData:data options:kNilOptions error:nil]);
}
Haben Sie irgendwelche Protokolle auf der php-Webseite, um zu sehen, wenn wenigstens die url aufgerufen wird? wie eine log-Datei oder sql-log?
Tatsächlich, die server-side-Programmierer sagte mir, dass, wenn die website erhält alle Daten, eine Antwort kommt immer zurück. Also, mein Fazit ist, dass er nicht einmal die Anfrage erhalten.
Beiseite: mit literalen macht die Dinge einfacher/übersichtlicher:
Was ist die Antwort, die Sie erhalten? Wenn Sie wirklich wollen, um herauszufinden, was Los ist auf der Draht-Holen Sie sich einen sniffer wie Charles (Kostenlose Testversion). Ich benutze es die ganze Zeit auch funktioniert SSL.
Überprüfen Sie heraus meine Antwort hier, und es wird Ihnen helfen. stackoverflow.com/questions/10524323/...
Tatsächlich, die server-side-Programmierer sagte mir, dass, wenn die website erhält alle Daten, eine Antwort kommt immer zurück. Also, mein Fazit ist, dass er nicht einmal die Anfrage erhalten.
Beiseite: mit literalen macht die Dinge einfacher/übersichtlicher:
NSDictionary *jsonDictionary = @{@"design":imageString};
Was ist die Antwort, die Sie erhalten? Wenn Sie wirklich wollen, um herauszufinden, was Los ist auf der Draht-Holen Sie sich einen sniffer wie Charles (Kostenlose Testversion). Ich benutze es die ganze Zeit auch funktioniert SSL.
Überprüfen Sie heraus meine Antwort hier, und es wird Ihnen helfen. stackoverflow.com/questions/10524323/...
InformationsquelleAutor IOS_DEV | 2013-02-16
Du musst angemeldet sein, um einen Kommentar abzugeben.
Entschied ich mich schließlich zum hochladen der Base64-Bild der Aufteilung in kleinere Teilfolgen. Um dies zu tun, und da musste ich viele
NSURLConnections
habe ich eine Unterklasse namensTagConnection
gibt einen tag für jede Verbindung, so dass es keine Verwechslungen zwischen Ihnen.Dann erstellte ich eine
TagConnection
Eigenschaft inMyViewController
mit dem Zweck, den Zugriff von einer beliebigen Funktion aus. Wie Sie sehen können, gibt es die-startAsyncLoad:withTag:
Funktion, die allocs und inits dieTagConnection
und die-connection:didReceiveData:
man die löscht es, wenn ich eine Antwort von dem server.Bezogen auf die
-uploadImage
Funktion, Erstens, es wandelt das Bild in ein string und dann teilt es und legen Sie die Stücke innerhalb der JSON-Anfrage. Es heißt, bis die variable offset ist größer als die Länge der Zeichenfolge, was bedeutet, dass alle Stücke hochgeladen wurden.Können Sie auch beweisen, dass jeder chunk wurde erfolgreich hochgeladen von überprüfung der server-Reaktion zu jeder Zeit und nur den Aufruf der
-uploadImage
Funktion, wenn es Erfolg gibt.Ich hoffe das war eine nützliche Antwort. Danke.
TagConnection.h
TagConnection.m
MyViewController.h
MyViewController.m
Tut mir Leid, aber das ist nicht bis zu mir.
InformationsquelleAutor IOS_DEV
Bitte denkt jetzt nicht das ist die Letzte option, dies ist nur meine Beobachtung.
Denke ich, sollten Sie senden, dass NSData in Blöcken statt der kompletten Daten.
Ich habe gesehen, wie die Methodik in der YouTube-Video-Upload-Fall.Senden Sie den Großen Satz von NSData (NSData von Video-Datei) in Blöcken von vielen NSData.
Sie verwendet die Gleichen Methodik für den Upload von großen Daten.
So tun sollte google über die Youtube data API Hochladen.Und sollten Sie die Suche aus, die Methode , YouTube-Uploader Verwendet.
Ich hoffe es kann dir helfen .
InformationsquelleAutor Kamar Shad