RestKit图片上传参数

时间:2012-11-26 08:58:26

标签: image cocoa-touch cocoa post restkit

我已经多次尝试使用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];

服务器收到卷曲调用,如下所示:

{
"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的一次尝试基于这篇文章(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 我试图附加导致崩溃的图像的一种方法在这里描述: Serialize nested image in RestKit (Rails Backend)

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

1 个答案:

答案 0 :(得分:1)

我们这样做的方法是将图像编码为base64Encoding并在服务器端对其进行解码。

像这样的东西。

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

之后它就像常规的RestKit帖子一样工作。