0

RestKit を使用して POST 画像ファイル転送を有効にしようと何度も試みましたが、これまでのところ curl を使用してのみ成功しています。動作するコードを以下に示しますが、これは同期的であり、UI が応答しなくなります。

NSArray *arguments =
[NSArrayarrayWithObjects:assetScriptFullPath,
  @"-F", [NSString stringWithFormat:@"asset[file]=@%@", fullPath],
  @"-F", [NSString stringWithFormat:@"asset[user_id]=%d", user_id],
  @"-F", [NSString stringWithFormat:@"asset[checksum]=%s", [(NSString *)md5hash UTF8String]],
  nil];
NSTask *task = [NSTasklaunchedTaskWithLaunchPath:@"/usr/bin/curl"arguments:arguments];

次のように、curl 呼び出しがサーバーで受信されます。

{
"asset"=>{
  "file"=>#<ActionDispatch::Http::UploadedFile:0xcfcc630
    @original_filename="IMG_6236.JPG",
    @content_type="image/jpeg",
    @headers="Content-Disposition: form-data; name=\"asset[file]\"; filename=\"IMG_6272.JPG\"\r\nContent-Type: image/jpeg\r\n",
    @tempfile=#<File:/tmp/RackMultipart20121117-21489-brm3b9>>,
  "user_id"=>"522",
  "checksum"=>"ab23bc492bac990d9022248315c743c1"
  }
}

RestKit を使用した 1 つの試みは、この投稿 ( RestKit Image Upload )に基づいていますが、アセット内にファイルをネストしません。「アセット」内にパラメータをネストしようとしてもうまくいかなかったり、クラッシュしたりしました。

{
  "user_id"=>"522",
  "checksum"=>"ab23bc492bac990d9022248315c743c1",
  "file"=>#<ActionDispatch::Http::UploadedFile:0x883eb9c
    @original_filename="file",
    @content_type="image/jpeg",
    @headers="Content-Disposition: form-data; name=\"file\"; filename=\"file\"\r\nContent-Type: image/jpeg\r\n",
    @tempfile=#<File:/tmp/RackMultipart20121125-25702-ac8ck9>>
}

以下の RestKit の高度なチュートリアルで説明されている方法を使用すると、必要な階層 (アセット内のファイル) を取得できないか、クラッシュせずに添付された画像データを取得できません。 https://github.com/RestKit/RestKit/blob/master/Docs/MobileTuts%20Advanced%20RestKit/Advanced_RestKit_Tutorial.md クラッシュの原因となるイメージをアタッチしようとした 1 つの方法をここで説明します: RestKit でネストされたイメージをシリアル化 (Rails バックエンド) )

{
"asset"=>{
  "user_id"=>"522", 
  "file"=>"@/Users/dev/IMG_6236.JPG", 
  "checksum"=>"ab23bc492bac990d9022248315c743c1"
  }
}

推奨事項はありますか?ありがとう!


サーバーが期待するものを変更できれば、フラットなパラメーター階層で動作させることができます。これは解決策ではありませんが、階層を変更することはできません。コードは以下のとおりです。

[params setFile:asset forParam:@"file"];
[params setData:[name dataUsingEncoding:NSUTF8StringEncoding] forParam:@"name"];
[params setData:[user_id dataUsingEncoding:NSUTF8StringEncoding] forParam:@"user_id"];
[client post:assetScriptPath params:params delegate:self];

これはサーバーが見るものですが、上記のように「アセット」内にこれがすべて必要です。

{
  "file"=>#<ActionDispatch::Http::UploadedFile:0xcfcc630
    @original_filename="IMG_6236.JPG",
    @content_type="image/jpeg",
    @headers="Content-Disposition: form-data; name=\"file\"; filename=\"IMG_6272.JPG\"\r\nContent-Type: image/jpeg\r\n",
    @tempfile=#<File:/tmp/RackMultipart20121117-21489-brm3b9>>,
  "user_id"=>"522",
  "checksum"=>"ab23bc492bac990d9022248315c743c1"
}
4

1 に答える 1

1

その方法は、画像を base64Encoding にエンコードし、サーバー側でデコードすることです。

このようなもの。

NSData *imageData = [NSData dataWithData:imageForUpload];
NSString *encodedString = [imageData base64Encoding];

その後は、通常の RestKit 投稿と同じように機能します。

于 2012-11-26T09:06:05.397 に答える