0

ユーザーが写真をレールに支えられた Web サービスにアップロードできるようにする iPhone アプリを構築しています。デバイスでアプリをテストしていますが、写真を撮って投稿することはできますが、photoData は null として返されます。これは、投稿を作成した後の xcode ログです。

post =     {
        content = Test;
        "created_at" = "2013-08-02T19:15:05Z";
        id = 2;
        photo =         {
            thumb =             {
                url = "<null>";
            };
            "thumb_retina" =             {
                url = "<null>";
            };
            url = "<null>";
        };
    };
    success = 1;
}

実際にデータをサーバーに投稿するための実装に欠けているものは何ですか?

レール側では、キャリアウェーブとミニマジックをアップローダーとして使用し、:fog ストレージを使用してすべてを S3 に保存しています。(少なくともそれが目標ですが、それは実現していません。) 私の投稿モデルには次のプロパティがあります。

@property (nonatomic, strong) NSString *content;
@property (nonatomic, strong) NSString *thumbnailUrl;
@property (nonatomic, strong) NSString *largeUrl;
@property (nonatomic, strong) NSData *photoData;

保存方法は次のとおりです。

- (void)saveWithProgressAtLocation:(CLLocation *)location
                         withBlock:(void (^)(CGFloat))progressBlock completion:(void (^)(BOOL, NSError *))completionBlock {

    if (!self.content) self.content = @"";

    NSDictionary *params = @{
                             @"post[content]" : self.content,

                             };

    NSURLRequest *postRequest = [[APIClient sharedClient] multipartFormRequestWithMethod:@"POST"
                                                                                    path:@"/posts"
                                                                              parameters:params
                                                               constructingBodyWithBlock:^(id<AFMultipartFormData> formData)
                                  {
                                      [formData appendPartWithFileData:self.photoData
                                                                  name:@"post[photo]"
                                                              fileName:@""
                                                              mimeType:@"image/png"];
                                  }];
    AFHTTPRequestOperation *operation = [[AFJSONRequestOperation alloc] initWithRequest:postRequest];
    [operation setUploadProgressBlock:^(NSUInteger bytesWritten, long long totalBytesWritten, long long totalBytesExpectedToWrite) {
        CGFloat progress = ((CGFloat)totalBytesWritten) / totalBytesExpectedToWrite;
        progressBlock(progress);
    }];

    [operation setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject) {
        if (operation.response.statusCode == 200 || operation.response.statusCode == 201) {
            NSLog(@"Created, %@", responseObject);
            NSDictionary *updatedPost = [responseObject objectForKey:@"post"];
            [self updateFromJSON:updatedPost];
            [self notifyCreated];
            completionBlock(YES, nil);
        } else {
            completionBlock(NO, nil);
        }
    } failure:^(AFHTTPRequestOperation *operation, NSError *error) {
        completionBlock(NO, error);
    }];

    [[APIClient sharedClient] enqueueHTTPRequestOperation:operation];
}

そして、photoViewController で onSave と呼ばれる実際のメソッドは次のとおりです。

- (void)save:(id)sender {

    Post *post = [[Post alloc] init];
    post.content = self.contentTextField.text;
    post.photoData = UIImagePNGRepresentation(self.imageView.image);

    [self.view endEditing:YES];

    ProgressView *progressView = [ProgressView presentInWindow:self.view.window];
    if (location) {
        [post saveWithProgressAtLocation:self.locationManager.location withBlock:^(CGFloat progress) {
            [progressView setProgress:progress];
        } completion:^(BOOL success, NSError *error) {
            [progressView dismiss];
            if (success) {
                [self.navigationController popViewControllerAnimated:YES];
            } else {
                NSLog(@"ERROR: %@", error);
            }
        }];
 }

問題は、photoData がサーバーに保存されないことです。理由はありますか?

最初は、レールに事前にコンパイルされたデフォルトの写真がありました: assets/images/nophoto.png - しかし、写真を撮るたびに、このデフォルトは新しい写真を上書きして投稿されます。これは明らかに私が望んでいるものではありません. だから私はそれを削除しました、そして今私はnullになっています。何か案は?

4

1 に答える 1

0

画像をデータに変換してからBase64文字列にエンコードし、その文字列をサーバーに保存し、サーバーから取得するときにBase64文字列をデータにデコードして使用します[UIImage imageWithData: data];

于 2013-08-05T10:30:12.160 に答える