webentwicklung-frage-antwort-db.com.de

Bild mit AFNetworking 2.0 hochladen

Ich schlage meinen Kopf damit gegen die Wand. Ich möchte UIImage aus der Bibliothek auswählen und auf den Server hochladen, wie es mit <form action="http://blabla.request.cfm" method="post" enctype="multipart/form-data"> möglich wäre. Statt Erfolg habe ich diesen Fehler erhalten:

error = Fehler Domain = NSCocoaErrorDomain Code = 3840 "Die Operation konnte nicht abgeschlossen werden. (Cocoa-Fehler 3840.)" (JSON-Text begann nicht mit Array oder Objekt und Option, um Fragmente nicht zulassen zu lassen.) UserInfo = 0x145e5d90 {NSDebugDescription = JSON-Text begann nicht mit Array oder Objekt und Option, um Fragmente nicht zulassen zu lassen.}

Ich habe diesen Weg versucht:

-(void)uploadPhoto{
NSString *path = @"http://blabla.request.cfm";
NSData *imageData = UIImageJPEGRepresentation(self.imageView.image, 0.9);
int priv = self.isPrivate ? 1 : 0;
NSDictionary *parameters = @{@"username": self.username, @"password" : self.password, @"private" : @(priv), @"photo" : imageData};
AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
[manager POST:path parameters:parameters constructingBodyWithBlock:^(id<AFMultipartFormData> formData) {
    if(self.imageView.image){
        [formData appendPartWithFileData:imageData name:@"avatar" fileName:@"avatar.jpg" mimeType:@"image/jpeg"];
    }
} success:^(AFHTTPRequestOperation *operation, id responseObject) {
    NSLog(@"[UploadVC] success = %@", responseObject);
} failure:^(AFHTTPRequestOperation *operation, NSError *error) {
    NSLog(@"[UploadVC] error = %@", error);
}];

[self blockView:self.view block:YES];
}

aber es funktioniert nicht ... Server sagt, dass es keine Datei gibt. Sie sind sich nicht sicher, ob die Verschlüsselung falsch ist, welcher Mime-Typ oder was?

Versuchte auch folgendes:

    [manager POST:path parameters:parameters success:^(AFHTTPRequestOperation *operation, id responseObject) {
    NSLog(@"[UploadVC] success = %@", responseObject);
} failure:^(AFHTTPRequestOperation *operation, NSError *error) {
    NSLog(@"[UploadVC] error = %@", error);
}];

und das:

    manager.responseSerializer = [AFJSONResponseSerializer serializer];
[manager POST:path parameters:parameters constructingBodyWithBlock:^(id<AFMultipartFormData> formData) {
    [formData appendPartWithFormData:imageData name:@"photo"];
} success:^(AFHTTPRequestOperation *operation, id responseObject) {
    NSLog(@"[UploadVC] success = %@", responseObject);
    [self blockView:self.view block:NO];
} failure:^(AFHTTPRequestOperation *operation, NSError *error) {
    NSLog(@"[UploadVC] error response.object = %@", operation.responseObject);
    [self blockView:self.view block:NO];
}];

nichts funktioniert. Ich hoffe jemand kann helfen, denn ich bin dabei und halte mich hier von Frage zu Frage auf SO
tia

EDIT: neuer Versuch
1) war zunächst mehrteilig
2) Upload-Aufgabe erstellen
keiner von ihnen arbeitete für mich, also versuche ich immer noch, damit umzugehen, sehe aber keine Lösung

33
raistlin

Ich bin mir nicht sicher, welcher Teil (ich glaube, dass ein paar Details fehlten) verantwortlich war, aber ich habe es endlich geschafft :) hier geht's:

-(void)uploadPhoto{
    AFHTTPRequestOperationManager *manager = [[AFHTTPRequestOperationManager alloc] initWithBaseURL:[NSURL URLWithString:@"http://server.url"]];
    NSData *imageData = UIImageJPEGRepresentation(self.avatarView.image, 0.5);
    NSDictionary *parameters = @{@"username": self.username, @"password" : self.password};
    AFHTTPRequestOperation *op = [manager POST:@"rest.of.url" parameters:parameters constructingBodyWithBlock:^(id<AFMultipartFormData> formData) {
        //do not put image inside parameters dictionary as I did, but append it!
        [formData appendPartWithFileData:imageData name:paramNameForImage fileName:@"photo.jpg" mimeType:@"image/jpeg"];
    } success:^(AFHTTPRequestOperation *operation, id responseObject) {
        NSLog(@"Success: %@ ***** %@", operation.responseString, responseObject);
    } failure:^(AFHTTPRequestOperation *operation, NSError *error) {
        NSLog(@"Error: %@ ***** %@", operation.responseString, error);
    }];
    [op start];
}

Klappt wunderbar :)

94
raistlin

Sie können ein Bild mit AFNetworking mit Swift so hochladen ... 

    let compression = 0.5

    let imageData = UIImageJPEGRepresentation("image", CGFloat(compression))

if imageData != nil{
   var manager = AFHTTPRequestOperationManager()
        manager.responseSerializer.acceptableContentTypes = NSSet(array: ["text/html", "application/json"]) as Set<NSObject>

        var dictParams = [
        "familyId":"10000",
        "contentBody" : "Some body content for the test application",
        "name" : "the name/title",
        "typeOfContent":"photo"
    ]

        let url = "http://...."
        manager.POST(url, parameters: dictParams, constructingBodyWithBlock: { (formData: AFMultipartFormData!) -> Void in
            //code
            formData.appendPartWithFileData(imageData, name: "file", fileName: "filename", mimeType: "image/png")
            }, success: { (operation:AFHTTPRequestOperation!, responseObject:AnyObject!) -> Void in
                println(responseObject)
            }, failure: { (operation:AFHTTPRequestOperation!, error:NSError!) -> Void in
                println(error)
        })
    }
2
EI Captain v2.0
 UIImage *image = [UIImage imageNamed:@"decline_clicked.png"];
NSData *imageData = UIImageJPEGRepresentation(image,1);


NSString *queryStringss = [NSString stringWithFormat:@"http://your server/uploadfile/"];
queryStringss = [queryStringss stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
manager.responseSerializer.acceptableContentTypes = [NSSet setWithObject:@"text/html"];


[manager POST:queryStringss parameters:nil constructingBodyWithBlock:^(id<AFMultipartFormData> formData)
 {


     [formData appendPartWithFileData:imageData name:@"fileName" fileName:@"decline_clicked.png" mimeType:@"image/jpeg"];



 }
      success:^(AFHTTPRequestOperation *operation, id responseObject)
 {



    NSDictionary *dict = [responseObject objectForKey:@"Result"];

    NSLog(@"Success: %@ ***** %@", operation.responseString, responseObject);


 }
      failure:^(AFHTTPRequestOperation *operation, NSError *error)
 {

     NSLog(@"Error: %@ ***** %@", operation.responseString, error);
 }];
1
Spydy