2009-11-06 153 views
0

好吧,我相信這一定是一個很常見的情況。我需要通過一個PHP頁面通過HTTP請求發送一個NSData變量,隨後將它存儲在MySQL中。稍後將由其他一些HTTP調用檢索到,然後再將其下載到NSData中。做這個的最好方式是什麼?通過PHP將NSData發送到MySQL的最佳方式是什麼?

我應該將NSData轉換成某種類型的字符串表示形式(base64等)嗎?我應該將數據作爲VARCHAR還是Blob存儲在MySQL中?數據長度不會超過MySQL/HTTP限制。

回答

1

第一條建議:您可以將它存儲在PHP 的會話中,例如, $ _SESSION ['mytext'] = < NSDATA>;不要忘記session_start();檢索你的字符串。

第二條建議:您可以將其存儲在XML文件中。這就是如果它支持XML

第三條建議:只是從MYSQL回撥是安全的。

2

通過對數據進行Base64編碼,您可能會讓自己變得更容易,以便來回傳輸到服務器。 (或yEnc或其他字節的ASCII編碼)。您當然可以可以來回傳輸原始字節(畢竟,這就是我們對圖像所做的,對吧?),但是不用擔心編碼和其他帶有字符串數據的HTTP標頭。

在服務器端,您可以將字符串存儲在數據庫的字符字段中,您可以解碼它們並存儲在BLOB中,也可以將它們保存到文件系統中。你的應用程序的要求,很難說什麼是「最好」的選擇。

+0

我發現,網頁服務的工作效果很好,您還可以獲得額外的好處,即一旦您獲得了服務,就可以輕鬆地支持其他設備。 它可能並不總是最高效的,但它絕對使它變得容易。 – jessecurry 2009-11-06 19:00:08

2

最簡單的方法是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 
+0

我錯過了什麼嗎?我只看到從已經Base64編碼的字符串返回NSData的方法。 Base64的方法從NSData或甚至從NSData獲得的NSString的字符串在哪裏編碼? – winnicki 2012-02-24 20:08:28

+0

'base64Encoding'和'base64EncodingWithLineLength:'方法將從NSData返回base64編碼的NSString。 – jessecurry 2012-02-27 18:24:26

相關問題