Изображение отправлено через XML с iPhone на App Engine - PullRequest
2 голосов
/ 12 сентября 2010

Я пытаюсь отправить небольшое изображение вместе с некоторой информацией XML в App Engine из моего приложения для iPhone. У меня проблемы с изображением где-то на пути. Ошибка отсутствует, и данные передаются в запись BLOB-объекта в Средство просмотра хранилища данных , но файлы BLOB-объектов в App Engine не отображаются в Средство просмотра BLOB-объектов . У меня есть подозрение, что изображение испорчено в одном из моих преобразований в App Engine или не сохраняется как правильный тип в App Engine. Что ты думаешь?

На iPhone есть соответствующий раздел, который кодирует изображение (используя стандартную функцию base64Encoding) и добавляет его в GDataXMLElement, который затем добавляется в GDataXMLDoc и отправляется с ASIHTTPRequest:

NSString *dataString = [self.data base64Encoding];
GDataXMLElement *tempXMLElement = [GDataXMLElement elementWithName:@"data" stringValue: dataString];
[imageElement addChild: tempXMLElement];

часть запроса ASIHTTP:

ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL: url]; 
[request setDelegate: self];
[request addRequestHeader:@"User-Agent" value: [NSString stringWithFormat:@"MyApp:%@", version]]; 
[request addRequestHeader:@"Content-Type" value:@"text/xml"]; 
[request setShouldStreamPostDataFromDisk:YES]; 
[request appendPostDataFromFile: path]; 
[request start]; 

В App Engine на Python (скорее всего, там, где проблема):

image_data_xml_element = image_xml_node.getElementsByTagName("data")[0]
image_data_base64_unicode = image_data_xml_element.firstChild.data
image_data_base64_ascii = image_data_unicode.encode("utf8")
image_data_string = binascii.a2b_base64(image_data_base64_ascii)
new_image.data = db.Blob(image_data_string) 

Дополнительно я попробовал:

image_data_xml_element = image_xml_node.getElementsByTagName("data")[0]
image_data_base64_unicode = image_data_xml_element.firstChild.data
image_data_string = base64.b64decode(image_data_base64_unicode)
new_image.data = db.Blob(image_data_string) 

Edit: Для полноты, вот библиотека цель-c base64, которую я использую - она ​​не выглядит так, как я ожидал:

static const char encodingTable[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
- (NSString *)base64Encoding;{
    if ([self length] == 0)
        return @"";

    char *characters = malloc((([self length] + 2) / 3) * 4);
    if (characters == NULL)
        return nil;
    NSUInteger length = 0;
    NSUInteger i = 0;
    while (i < [self length]){
        char buffer[3] = {0,0,0};
        short bufferLength = 0;
        while (bufferLength < 3 && i < [self length])
            buffer[bufferLength++] = ((char *)[self bytes])[i++];

        //  Encode the bytes in the buffer to four characters, including padding "=" characters if necessary.
        characters[length++] = encodingTable[(buffer[0] & 0xFC) >> 2];
        characters[length++] = encodingTable[((buffer[0] & 0x03) << 4) | ((buffer[1] & 0xF0) >> 4)];
        if (bufferLength > 1)
            characters[length++] = encodingTable[((buffer[1] & 0x0F) << 2) | ((buffer[2] & 0xC0) >> 6)];
        else characters[length++] = '=';
        if (bufferLength > 2)
            characters[length++] = encodingTable[buffer[2] & 0x3F];
        else characters[length++] = '=';    
    }

    return [[[NSString alloc] initWithBytesNoCopy:characters length:length encoding:NSASCIIStringEncoding freeWhenDone:YES] autorelease];
}

Ответы [ 2 ]

2 голосов
/ 12 сентября 2010

Средство просмотра Blob отображает файлы, загруженные с помощью API Blobstore, а не те, которые добавляются в обычные объекты хранилища данных в свойствах Blob.

0 голосов
/ 03 октября 2010

Я закончил тем, что отправил изображение в Blobstore перед отправкой XML, а затем, в случае успеха, отправил XML, включая ключ, к данным изображения Blobstore. Сначала я не осознавал, что Blobstore - это объект, отличный от Blobs, хранящихся в Datastore.

Спасибо

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...