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 的一次尝试是基于这篇文章(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 此处描述了我尝试附加导致崩溃的图像的一种方法: 序列化 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 回答