REST-сервер Drupal, проблема загрузки изображений из нескольких частей / данных формы из приложения iOS с использованием ASIHTTPRequest - PullRequest
0 голосов
/ 27 марта 2012

Я занимаюсь разработкой приложения для iOS, которое загружает изображение и текст на REST-сервер Drupal.Изображение и текст должны храниться в таблице MySQL.

Я использую ASIHTTPRequest для выполнения POST на моем REST-сервере.На стороне сервера я следовал этому примеру для настройки REST-сервера Drupal: 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))

Кажется, это неправильный способ проверки наличия данных изображения ... Как правильно ссылаться на данные изображения?

Заранее спасибо за помощь.

1 Ответ

0 голосов
/ 28 марта 2012

Наконец-то знай, что я должен делать.Глупый я, я забыл, что был глобальный php $ _FILES, который является загруженным файлом!Когда я вспомнил это, было очень легко сохранить изображение в таблице MySQL.

...