2012-03-27 32 views
0

我正在开发一个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)) 

看来,这不是正确的方式用于检查图像数据是否存在......参考图像数据的正确方法是什么?

感谢您提前给予的帮助。

回答

0

终于知道我要做什么了。愚蠢的我,我忘了有一个名为$ _FILES的php全局文件,它是上传的文件!当我记住这一点时,很容易将图像存储到MySQL表中。

相关问题