好吧,我相信這一定是一個很常見的情況。我需要通過一個PHP頁面通過HTTP請求發送一個NSData變量,隨後將它存儲在MySQL中。稍後將由其他一些HTTP調用檢索到,然後再將其下載到NSData中。做這個的最好方式是什麼?通過PHP將NSData發送到MySQL的最佳方式是什麼?
我應該將NSData轉換成某種類型的字符串表示形式(base64等)嗎?我應該將數據作爲VARCHAR還是Blob存儲在MySQL中?數據長度不會超過MySQL/HTTP限制。
好吧,我相信這一定是一個很常見的情況。我需要通過一個PHP頁面通過HTTP請求發送一個NSData變量,隨後將它存儲在MySQL中。稍後將由其他一些HTTP調用檢索到,然後再將其下載到NSData中。做這個的最好方式是什麼?通過PHP將NSData發送到MySQL的最佳方式是什麼?
我應該將NSData轉換成某種類型的字符串表示形式(base64等)嗎?我應該將數據作爲VARCHAR還是Blob存儲在MySQL中?數據長度不會超過MySQL/HTTP限制。
第一條建議:您可以將它存儲在PHP 的會話中,例如, $ _SESSION ['mytext'] = < NSDATA>;不要忘記session_start();檢索你的字符串。
第二條建議:您可以將其存儲在XML文件中。這就是如果它支持XML
第三條建議:只是從MYSQL回撥是安全的。
通過對數據進行Base64編碼,您可能會讓自己變得更容易,以便來回傳輸到服務器。 (或yEnc或其他字節的ASCII編碼)。您當然可以可以來回傳輸原始字節(畢竟,這就是我們對圖像所做的,對吧?),但是不用擔心編碼和其他帶有字符串數據的HTTP標頭。
在服務器端,您可以將字符串存儲在數據庫的字符字段中,您可以解碼它們並存儲在BLOB中,也可以將它們保存到文件系統中。你的應用程序的要求,很難說什麼是「最好」的選擇。
最簡單的方法是Base64對數據進行編碼並創建一個Web服務,讓您可以來回發送信息。
這裏是做Base64編碼/解碼,我在網上找到一個類別:
ECBase64.h
#import <Foundation/Foundation.h>
@interface NSData (NSDataBase64Additions)
+ (NSData*)dataWithBase64EncodedString: (NSString*)string;
- (id)initWithBase64EncodedString: (NSString*)string;
- (NSString*)base64Encoding;
- (NSString*)base64EncodingWithLineLength: (NSUInteger)lineLength;
@end
ECBase64.m:
#import "ECBase64.h"
static char encodingTable[64] = {
'A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P',
'Q','R','S','T','U','V','W','X','Y','Z','a','b','c','d','e','f',
'g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v',
'w','x','y','z','0','1','2','3','4','5','6','7','8','9','+','/' };
@implementation NSData (NSDataBase64Additions)
+ (NSData*)dataWithBase64EncodedString: (NSString*)string
{
NSData* result = [[NSData alloc] initWithBase64EncodedString: string];
return [result autorelease];
}
- (id)initWithBase64EncodedString: (NSString*)string
{
NSMutableData* mutableData = nil;
if (string)
{
unsigned long ixtext = 0;
unsigned long lentext = 0;
unsigned char ch = 0;
unsigned char inbuf[4], outbuf[3];
short i = 0, ixinbuf = 0;
BOOL flignore = NO;
BOOL flendtext = NO;
NSData* base64Data = nil;
const unsigned char* base64Bytes = nil;
// Convert the string to UTF8 data.
base64Data = [string dataUsingEncoding: NSUTF8StringEncoding];
base64Bytes = [base64Data bytes];
mutableData = [NSMutableData dataWithCapacity: [base64Data length]];
lentext = [base64Data length];
while (YES)
{
if (ixtext >= lentext)
break;
ch = base64Bytes[ixtext++];
flignore = NO;
if ((ch >= 'A') && (ch <= 'Z'))
ch = ch - 'A';
else if ((ch >= 'a') && (ch <= 'z'))
ch = ch - 'a' + 26;
else if ((ch >= '0') && (ch <= '9'))
ch = ch - '0' + 52;
else if (ch == '+')
ch = 62;
else if (ch == '=')
flendtext = YES;
else if (ch == '/')
ch = 63;
else
flignore = YES;
if (!flignore)
{
short ctcharsinbuf = 3;
BOOL flbreak = NO;
if (flendtext)
{
if (!ixinbuf)
break;
if ((ixinbuf == 1) || (ixinbuf == 2))
ctcharsinbuf = 1;
else
ctcharsinbuf = 2;
ixinbuf = 3;
flbreak = YES;
}
inbuf [ixinbuf++] = ch;
if (ixinbuf == 4)
{
ixinbuf = 0;
outbuf [0] = (inbuf[0] << 2) | ((inbuf[1] & 0x30) >> 4);
outbuf [1] = ((inbuf[1] & 0x0F) << 4) | ((inbuf[2] & 0x3C) >> 2);
outbuf [2] = ((inbuf[2] & 0x03) << 6) | (inbuf[3] & 0x3F);
for(i = 0; i < ctcharsinbuf; ++i)
[mutableData appendBytes: &outbuf[i] length: 1];
}
if (flbreak)
break;
}
}
}
self = [self initWithData: mutableData];
return self;
}
#pragma mark -
- (NSString*) base64Encoding
{
return [self base64EncodingWithLineLength: 0];
}
- (NSString*)base64EncodingWithLineLength: (unsigned int)lineLength
{
const unsigned char* bytes = [self bytes];
NSMutableString* result = [NSMutableString stringWithCapacity: [self length]];
unsigned long ixtext = 0;
unsigned long lentext = [self length];
long ctremaining = 0;
unsigned char inbuf[3], outbuf[4];
short i = 0;
short charsonline = 0, ctcopy = 0;
unsigned long ix = 0;
while (YES)
{
ctremaining = lentext - ixtext;
if (ctremaining <= 0)
break;
for(i = 0; i < 3; ++i)
{
ix = ixtext + i;
if (ix < lentext)
inbuf[i] = bytes[ix];
else
inbuf [i] = 0;
}
outbuf [0] = (inbuf [0] & 0xFC) >> 2;
outbuf [1] = ((inbuf [0] & 0x03) << 4) | ((inbuf [1] & 0xF0) >> 4);
outbuf [2] = ((inbuf [1] & 0x0F) << 2) | ((inbuf [2] & 0xC0) >> 6);
outbuf [3] = inbuf [2] & 0x3F;
ctcopy = 4;
switch (ctremaining)
{
case 1:
ctcopy = 2;
break;
case 2:
ctcopy = 3;
break;
}
for(i = 0; i < ctcopy; ++i)
[result appendFormat: @"%c", encodingTable[outbuf[i]]];
for(i = ctcopy; i < 4; ++i)
[result appendFormat: @"%c",'='];
ixtext += 3;
charsonline += 4;
if (lineLength > 0)
{
if (charsonline >= lineLength)
{
charsonline = 0;
[result appendString: @"\n"];
}
}
}
return result;
}
@end
我錯過了什麼嗎?我只看到從已經Base64編碼的字符串返回NSData的方法。 Base64的方法從NSData或甚至從NSData獲得的NSString的字符串在哪裏編碼? – winnicki 2012-02-24 20:08:28
'base64Encoding'和'base64EncodingWithLineLength:'方法將從NSData返回base64編碼的NSString。 – jessecurry 2012-02-27 18:24:26
我發現,網頁服務的工作效果很好,您還可以獲得額外的好處,即一旦您獲得了服務,就可以輕鬆地支持其他設備。 它可能並不總是最高效的,但它絕對使它變得容易。 – jessecurry 2009-11-06 19:00:08