我正在开发一个iOS应用程序,将图像和文本上传到Drupal REST服务器。图像和文本将被存储在MySQL表中。使用ASIHTTPRequest从iOS应用程序Drupal REST服务器,multipart/form-data图像上传问题
我正在使用ASIHTTPRequest来对我的REST服务器进行POST。 在服务器端,我跟着这个例子建立一个Drupal REST服务器:http://drupal.org/node/1246470
我遇到的问题是我不知道如何引用REST服务器上的图像。无论何时我尝试发送信息,我都会收到错误“HTTP/1.0 406不可接受:缺少问题属性图像”。任何人都可以指出我做错了什么或我缺少什么?
我的iOS版本是5.1。 我的Drupal版本是7.8。
我iOS的代码如下:
NSString* timestamp = [NSString stringWithFormat:@"%.0f", [[NSDate date] timeIntervalSince1970]];
//Add the timestamp to the filename
NSMutableString* filename = [NSMutableString stringWithString:@"issue-"];
[filename appendString: timestamp];
[filename appendString: @".png"];
//Convert the image into an NSData object
NSData* imageData = UIImagePNGRepresentation(imageView.image);
NSURL *url = [NSURL URLWithString: SERVICE_URL];
ASIFormDataRequest *request = [ASIFormDataRequest requestWithURL: url];
[request setPostValue: emailAddress forKey:@"email"];
[request setPostValue: details forKey:@"details"];
[request setData: imageData withFileName: filename andContentType: @"image/png" forKey: @"image"];
[request setPostFormat:ASIMultipartFormDataPostFormat];
[request setRequestMethod:@"POST"];
[request startSynchronous];
至于服务器端,这里是我设置的hook_services_resources:
/**
* Implementation of hook_services_services().
*/
function issue_services_resources() {
return array(
'issue' => array(
'retrieve' => array(
'help' => 'Retrieves an issue',
'file' => array('file' => 'inc', 'module' => 'issue'),
'callback' => '_issue_retrieve',
'access callback' => '_issue_access',
'access arguments' => array('view'),
'access arguments append' => TRUE,
'args' => array(
array(
'name' => 'id',
'type' => 'int',
'description' => 'The id of the issue to get',
'source' => array('path' => '0'),
'optional' => FALSE,
),
),
),
'create' => array(
'help' => 'Creates an issue',
'file' => array('file' => 'inc', 'module' => 'issue'),
'callback' => '_issue_create',
'access arguments' => array('issue service create'),
'access arguments append' => FALSE,
'args' => array(
array(
'name' => 'data',
'type' => 'struct',
'description' => 'The issue object',
'source' => 'data',
'optional' => FALSE,
),
),
),
'update' => array(
'help' => 'Updates an issue',
'file' => array('file' => 'inc', 'module' => 'issue'),
'callback' => '_issue_update',
'access callback' => '_issue_access',
'access arguments' => array('update'),
'access arguments append' => TRUE,
'args' => array(
array(
'name' => 'id',
'type' => 'int',
'description' => 'The id of the node to update',
'source' => array('path' => '0'),
'optional' => FALSE,
),
array(
'name' => 'data',
'type' => 'struct',
'description' => 'The issue data object',
'source' => 'data',
'optional' => FALSE,
),
),
),
'delete' => array(
'help' => 'Deletes an issue',
'file' => array('file' => 'inc', 'module' => 'issue'),
'callback' => '_issue_delete',
'access callback' => '_issue_access',
'access arguments' => array('delete'),
'access arguments append' => TRUE,
'args' => array(
array(
'name' => 'nid',
'type' => 'int',
'description' => 'The id of the issue to delete',
'source' => array('path' => '0'),
'optional' => FALSE,
),
),
),
'index' => array(
'help' => 'Retrieves a listing of issues',
'file' => array('file' => 'inc', 'module' => 'issue'),
'callback' => '_issue_index',
'access callback' => 'user_access',
'access arguments' => array('access content'),
'access arguments append' => FALSE,
'args' => array(
array(
'name' => 'page',
'type' => 'int',
'description' => '',
'source' => array(
'params' => 'page',
),
'optional' => TRUE,
'default value' => 0,
),
array(
'name' => 'parameters',
'type' => 'array',
'description' => '',
'source' => 'param',
'optional' => TRUE,
'default value' => array(),
),
),
),
),
);
}
我有一种预感,这可能是对的参数“创建”。从我所拥有的,我只有“数据”或类型“结构”。它看起来我可能需要有一个额外的图像参数?如果是这样,它会是什么?
和这里就是我做的406错误的检查和设置:
function _issue_create($data) {
if (isset($data) && is_array($data)) $data=(object) $data;
unset($data->id);
$data->created = time();
$data->modified = time();
if (!isset($data->email)) {
return services_error('Missing issue attribute email address', 406);
}
if (!isset($data->details)) {
return services_error('Missing issue attribute details', 406);
}
if (!isset($data->image)) {
return services_error('Missing issue attribute image', 406);
}
issue_write_issue($data);
return (object)array(
'id' => $data->id,
'uri' => services_resource_uri(array('issue', $data->id)),
);
}
的问题是,我做了检查:
if (!isset($data->image))
看来,这不是正确的方式用于检查图像数据是否存在......参考图像数据的正确方法是什么?
感谢您提前给予的帮助。