WiFi傳書(shū)

WiFi傳書(shū)

1叶洞、iPhone傳輸文件的幾種方式

  1. 通過(guò)itunes傳輸文件到documents
  2. 通過(guò)蘋(píng)果iOS11文件APP->更多->打開(kāi)
  3. 客戶(hù)端自定義協(xié)議下載(百度閱讀先將文件上傳到服務(wù)器田篇,再下載)
  4. WiFi傳書(shū)

2、WiFi傳書(shū)的原理

  • 將手機(jī)作為服務(wù)器兴革,在同一網(wǎng)絡(luò)下绎晃,可以用過(guò)瀏覽器訪(fǎng)問(wèn)到服務(wù)器,上傳文件后杂曲,服務(wù)器(即手機(jī))將文件存儲(chǔ)到沙盒內(nèi)

3庶艾、技術(shù)選型

  • CocoaHTTPServer 是面向Mac OS X和iOS app的輕量級(jí)、可嵌入的HTTP服務(wù)器框架擎勘。
  • CocoaHTTPServer是由deusty designs開(kāi)源的一個(gè)項(xiàng)目咱揍,支持異步socket,ipv4和ipv6棚饵,http Authentication和TLS加密
  • 瀏覽器上傳本地書(shū)籍煤裙,使用ajax + html上傳文件,表單上傳的方式

4噪漾、HTTPSERVER 技術(shù)要點(diǎn)

1硼砰、初始化HTTPServer,設(shè)置web路徑,需要提供web文件

- (void)setServer {
    self.httpServer = [[HTTPServer alloc] init];//初始化
    [self.httpServer setType:@"_http._tcp."];//通過(guò)Bonjour服務(wù)發(fā)布的類(lèi)型,允許瀏覽器訪(fǎng)問(wèn)
    [self.httpServer setPort:8080];//設(shè)置端口
    [self.httpServer setConnectionClass:[MyHTTPConnection class]];//設(shè)置處理連接的自定義類(lèi)文件
    NSString *webPath = [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:@"Web"];
    DDLogInfo(@"Setting document root: %@", webPath);
    [self.httpServer setDocumentRoot:webPath];//設(shè)置服務(wù)器根目錄
    NSLog(@"home = %@",NSHomeDirectory());
}

2、 設(shè)置支持的方法

- (BOOL)supportsMethod:(NSString *)method atPath:(NSString *)path
{
    HTTPLogTrace();
    
    // Add support for POST
    if ([method isEqualToString:@"POST"])
    {
        return YES;
    }
    if ([method isEqualToString:@"DELETE"]) {
        return YES;
    }
    if ([method isEqualToString:@"GET"]) {
        return YES;
    }
    return [super supportsMethod:method atPath:path];
}

2欣硼、 處理請(qǐng)求

- (NSObject<HTTPResponse> *)httpResponseForMethod:(NSString *)method URI:(NSString *)path
{
    HTTPLogTrace();
    
    if ([method isEqualToString:@"POST"] && [path isEqualToString:@"/upload.html"])
    {

        // this method will generate response with links to uploaded file
        NSMutableString* filesStr = [[NSMutableString alloc] init];

        for( NSString* filePath in uploadedFiles ) {
            //generate links
            [filesStr appendFormat:@"<a href=\"%@\"> %@ </a><br/>",filePath, [filePath lastPathComponent]];
        }
        NSString* templatePath = [[config documentRoot] stringByAppendingPathComponent:@"upload.html"];
        NSDictionary* replacementDict = [NSDictionary dictionaryWithObject:filesStr forKey:@"MyFiles"];
        // use dynamic file response to apply our links to response template
        return [[HTTPDynamicFileResponse alloc] initWithFilePath:templatePath forConnection:self separator:@"%" replacementDictionary:replacementDict];
    }
    if( [method isEqualToString:@"GET"] && [path hasPrefix:@"/upload/"] ) {
        // let download the uploaded files
        return [[HTTPFileResponse alloc] initWithFilePath: [[config documentRoot] stringByAppendingString:path] forConnection:self];
    }
    
    return [super httpResponseForMethod:method URI:path];
}

3夺刑、 處理文件上傳內(nèi)容

上次有2個(gè)part:一個(gè)是文件名,另一個(gè)是文件內(nèi)容

- (BOOL)expectsRequestBodyFromMethod:(NSString *)method atPath:(NSString *)path
{
    HTTPLogTrace();
    
    // Inform HTTP server that we expect a body to accompany a POST request
    
    if([method isEqualToString:@"POST"] && [path hasPrefix:@"/upload"]) {
        // here we need to make sure, boundary is set in header
        NSString* contentType = [request headerField:@"Content-Type"];
        NSUInteger paramsSeparator = [contentType rangeOfString:@";"].location;
        if( NSNotFound == paramsSeparator ) {
            return NO;
        }
        if( paramsSeparator >= contentType.length - 1 ) {
            return NO;
        }
        NSString* type = [contentType substringToIndex:paramsSeparator];
        if( ![type isEqualToString:@"multipart/form-data"] ) {
            // we expect multipart/form-data content type
            return NO;
        }
        
        // enumerate all params in content-type, and find boundary there
        NSArray* params = [[contentType substringFromIndex:paramsSeparator + 1] componentsSeparatedByString:@";"];
        for( NSString* param in params ) {
            paramsSeparator = [param rangeOfString:@"="].location;
            if( (NSNotFound == paramsSeparator) || paramsSeparator >= param.length - 1 ) {
                continue;
            }
            NSString* paramName = [param substringWithRange:NSMakeRange(1, paramsSeparator-1)];
            NSString* paramValue = [param substringFromIndex:paramsSeparator+1];
            
            if( [paramName isEqualToString: @"boundary"] ) {
                // let's separate the boundary from content-type, to make it more handy to handle
                [request setHeaderField:@"boundary" value:paramValue];
            }
        }
        // check if boundary specified
        if( nil == [request headerField:@"boundary"] )  {
            return NO;
        }
        return YES;
    }
    return [super expectsRequestBodyFromMethod:method atPath:path];
}

4分别、 處理body數(shù)據(jù)

- (void)processBodyData:(NSData *)postDataChunk
{
    HTTPLogTrace();
    // append data to the parser. It will invoke callbacks to let us handle
    // parsed data.
    [request appendData:postDataChunk];//post body存儲(chǔ)
    [parser appendData:postDataChunk];//文件存儲(chǔ)
}

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市存淫,隨后出現(xiàn)的幾起案子耘斩,更是在濱河造成了極大的恐慌,老刑警劉巖桅咆,帶你破解...
    沈念sama閱讀 222,681評(píng)論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件括授,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)荚虚,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,205評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門(mén)薛夜,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人版述,你說(shuō)我怎么就攤上這事梯澜。” “怎么了渴析?”我有些...
    開(kāi)封第一講書(shū)人閱讀 169,421評(píng)論 0 362
  • 文/不壞的土叔 我叫張陵晚伙,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我俭茧,道長(zhǎng)咆疗,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 60,114評(píng)論 1 300
  • 正文 為了忘掉前任母债,我火速辦了婚禮午磁,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘毡们。我一直安慰自己迅皇,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,116評(píng)論 6 398
  • 文/花漫 我一把揭開(kāi)白布漏隐。 她就那樣靜靜地躺著喧半,像睡著了一般。 火紅的嫁衣襯著肌膚如雪青责。 梳的紋絲不亂的頭發(fā)上挺据,一...
    開(kāi)封第一講書(shū)人閱讀 52,713評(píng)論 1 312
  • 那天,我揣著相機(jī)與錄音脖隶,去河邊找鬼扁耐。 笑死,一個(gè)胖子當(dāng)著我的面吹牛产阱,可吹牛的內(nèi)容都是我干的婉称。 我是一名探鬼主播,決...
    沈念sama閱讀 41,170評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼构蹬,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼王暗!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起庄敛,我...
    開(kāi)封第一講書(shū)人閱讀 40,116評(píng)論 0 277
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤俗壹,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后藻烤,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體绷雏,經(jīng)...
    沈念sama閱讀 46,651評(píng)論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡头滔,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,714評(píng)論 3 342
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了涎显。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片坤检。...
    茶點(diǎn)故事閱讀 40,865評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖期吓,靈堂內(nèi)的尸體忽然破棺而出早歇,到底是詐尸還是另有隱情,我是刑警寧澤膘婶,帶...
    沈念sama閱讀 36,527評(píng)論 5 351
  • 正文 年R本政府宣布缺前,位于F島的核電站,受9級(jí)特大地震影響悬襟,放射性物質(zhì)發(fā)生泄漏衅码。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,211評(píng)論 3 336
  • 文/蒙蒙 一脊岳、第九天 我趴在偏房一處隱蔽的房頂上張望逝段。 院中可真熱鬧,春花似錦割捅、人聲如沸奶躯。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,699評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)嘹黔。三九已至,卻和暖如春莫瞬,著一層夾襖步出監(jiān)牢的瞬間儡蔓,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,814評(píng)論 1 274
  • 我被黑心中介騙來(lái)泰國(guó)打工疼邀, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留喂江,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 49,299評(píng)論 3 379
  • 正文 我出身青樓旁振,卻偏偏與公主長(zhǎng)得像获询,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子拐袜,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,870評(píng)論 2 361

推薦閱讀更多精彩內(nèi)容