【问题标题】:Using AFNetworking to post both text and multiple images to Google Blobstore使用 AFNetworking 将文本和多个图像发布到 Google Blobstore
【发布时间】:2014-07-14 23:47:39
【问题描述】:

作为参考,这是我在 iOS/Objective-c 中尝试做的工作的 android/Java 版本

public static void saveTextsAndImagesOnServer(List<byte[]> images, long someID1, String servingUrl, boolean someFlag)
            throws ClientProtocolException, IOException {
        Log.d(TAG, "saveTextsAndImagesOnServer started ");
        HttpClient httpClient = new DefaultHttpClient();
        HttpPost postRequest = new HttpPost(servingUrl);
        MultipartEntity reqEntity = new MultipartEntity(HttpMultipartMode.BROWSER_COMPATIBLE);

        AdditionData extr = AdditionData.getInstance();
        reqEntity.addPart("red", new ByteArrayBody(("" + extr.getred()).getBytes(), "red"));
        reqEntity.addPart("yellow", new ByteArrayBody(extr.getyellow.getBytes(), "yellow"));
        reqEntity.addPart("green", new ByteArrayBody(extr.getgreen().getBytes(), "green"));
        reqEntity.addPart("blue", new ByteArrayBody((extr.getblue()).getBytes(), "blue"));
        reqEntity.addPart("someID1", new ByteArrayBody(("" + someID1).getBytes(), "someID1"));
        if (someFlag) {
            reqEntity.addPart("someFlag", new ByteArrayBody("true".getBytes(), "someFlag"));
        }
        int i = 0;
        for (byte[] img : images) {
            ByteArrayBody image = new ByteArrayBody(img, "img" + i++ + ".png");
            reqEntity.addPart("image", image);
        }
        postRequest.setEntity(reqEntity);
        HttpResponse response = httpClient.execute(postRequest);
        Log.d(TAG, "saveTextsAndImagesOnServer ended with response " + response.toString());
    }

总结:基本上我可以将图像和随附的元数据发送到 blobstore。例如,元数据可以帮助我识别图片的发送者。

现在尝试在 iOS 中做同样的事情,我编写了下面的代码。但无论出于何种原因,元数据都没有保存在 blobstore 中。我尝试了很多不同的东西,但我仍然一无所获。我尝试将元数据字符串更改为 base-64,但没有成功。

IOS 代码

-(void)postMultipartToServer
{
    if (!self.destinationUrl) {
        return;
    }

    AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
    NSLog(@"IS dictionary empty? %@", self.textDictionary);

    [manager POST:self.destinationUrl
       parameters:self.textDictionary
    constructingBodyWithBlock:^(id<AFMultipartFormData> formData) {
        if ([self.imageDictionaries count]>0)
            for (NSDictionary *imgDic in self.imageDictionaries) {
                [formData appendPartWithFileData:UIImagePNGRepresentation([imgDic objectForKey:@"image"])
                                            name:[imgDic objectForKey:@"name"]//@"image"
                                        fileName:[imgDic objectForKey:@"fileName"]//@"image.png"
                                        mimeType:[imgDic objectForKey:@"mimeType"]//@"image/png"
                 ];
            }


    } success:^(AFHTTPRequestOperation *operation, id responseObject) {
        NSLog(@"Success: %@", responseObject);
    } failure:^(AFHTTPRequestOperation *operation, NSError *error) {
        NSLog(@"Error: %@", error);
    }];
}

这是字典

 NSDictionary *textDictionary = @{
                                 @"yellow”:self. yellow,
                                 @"red":self. red,
                                 @"green”:self.green,
                                 @“blue”:self. blue,
                                 @“spouse”:self.spouse,
                                 @"isFamouse”:@”true”};//you get the idea

我在哪里?

鉴于这种设计适用于 android,我知道这是可能的,特别是因为 http 在涉及语言时应该是不可知的。所以问题被简化为将字符串从 iOS 保存到 Google blobstore。

我开始赏金,希望有人能帮助我解决这个问题(也许是 google blobstore-iOS 专家)。我还注意到其他人也问了几乎相同的问题,但没有答案。我问过这个问题的其他方式:

AFHTTPRequestOperationManager post multi-part request not working

How to convert NSString to UIImage for appengine blobstore

【问题讨论】:

  • 仅供参考:目的地是 Google Blobstore(如果这很重要的话)
  • 本网站不是免费的代码翻译服务。先做好自己的工作。如果您有具体问题,请发布相关代码并说明您的问题。
  • @rmaddy 我已经这样做了,现在开始赏金了。
  • 对于 java 代码参考:HttpMultipartMode.BROWSER_COMPATIBLE 使 MultipartEntity 省略 'Content-Type' 和 'Content-Transfer-Encoding' 标志以与旧 Web 服务器兼容。 AFNetworking 有什么等价物吗?还是 iOS/Objective-c?

标签: ios objective-c afnetworking google-cloud-endpoints blobstore


【解决方案1】:

替换方法如下

-(void)postMultipartToServer
{
    if (!self.destinationUrl) {
        return;
    }

    AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];

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

        if ([self.textDictionary count]>0){
            if ([self.textDictionary count]>0)
                [self.textDictionary enumerateKeysAndObjectsUsingBlock:^(id key, id object, BOOL *stop) {
                    [formData appendPartWithFileData:[object dataUsingEncoding:NSUTF8StringEncoding]
                                                name:key
                                            fileName:key
                                            mimeType:@"application/json"
                     ];

                }];
        }

        if ([self.imageDictionaries count]>0)
            for (NSDictionary *imgDic in self.imageDictionaries) {
                [formData appendPartWithFileData:UIImagePNGRepresentation([imgDic objectForKey:@"image"])
                                            name:[imgDic objectForKey:@"name"]//@"image"
                                        fileName:[imgDic objectForKey:@"fileName"]//@"image.png"
                                        mimeType:[imgDic objectForKey:@"mimeType"]//@"image/png"
                 ];
            }
    } success:^(AFHTTPRequestOperation *operation, id responseObject) {
        NSLog(@"Success: %@", responseObject);
    } failure:^(AFHTTPRequestOperation *operation, NSError *error) {
        NSLog(@"Error: %@", error);
    }];
}

【讨论】:

    【解决方案2】:

    最后,http 请求将是一个字符串。您可以记录该字符串。可能想为此使用一个小图像。然后对android请求做同样的事情,看看有什么区别。

    How to print AFNetworking request as RAW data

    【讨论】:

    • 我得到了 AFNetworking 2.0 的日志,但它没有显示 POST 的内容。至于接受的答案,我不明白如何实现。
    • 如果它不能解决您的问题,则没有理由接受它。糟糕,尝试换行,但它已发布。 “[manager POST: ...”的返回值为AFHTTPRequestOperation。如果您为此声明一个变量“request”,则可以将此“[[NSString alloc] initWithData:request.HTTPBody encoding:4]”放在成功和失败块中以记录请求正文。老实说,我不是 100% 的,我已经完成了 iOS 网络,但没有使用 AFNetworking。只是想帮忙。
    猜你喜欢
    • 1970-01-01
    • 2015-04-01
    • 1970-01-01
    • 2011-10-30
    • 1970-01-01
    • 1970-01-01
    • 2011-09-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多