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"
}