文件上傳

一、文件數(shù)據(jù)拼接

  1. 文件上傳設(shè)置請(qǐng)求體的數(shù)據(jù)格式

    //請(qǐng)求體拼接格式
    //分隔符:----WebKitFormBoundaryhBDKBUWBHnAgvz9c
    
    //01.文件參數(shù)拼接格式
    
    --分隔符
    Content-Disposition:參數(shù)
    Content-Type:參數(shù)
    空行
    文件參數(shù)
    
    文件參數(shù)
    --分割線\r\n
    Content-Disposition: form-data; name="參數(shù)名"; filename="文件名"\r\n
    Content-Type: 文件的MIMEType\r\n
    \r\n
    文件數(shù)據(jù)
    \r\n
    
    參數(shù)結(jié)束的標(biāo)記
    --分割線--\r\n
    
    //02.非文件拼接參數(shù)
    --分隔符
    Content-Disposition:參數(shù)
    空行
    非文件的二進(jìn)制數(shù)據(jù)
    
    設(shè)置請(qǐng)求頭
    [request setValue:@"multipart/form-data; boundary=分割線" forHTTPHeaderField:@"Content-Type"];
    
    設(shè)置請(qǐng)求體
    非文件參數(shù)
    --分割線\r\n
    Content-Disposition: form-data; name="參數(shù)名"\r\n
    \r\n
    參數(shù)值
    \r\n
    
    //03.結(jié)尾標(biāo)識(shí)
    --分隔符--
    
  2. 相關(guān)代碼

-(NSData *)bodyData
{
    NSMutableData *fileData = [NSMutableData data];

    /*
     5.1 拼接文件參數(shù):
     --分隔符
     Content-Disposition: form-data; name="file"; filename="123.png"
     Content-Type: application/octet-stream
     空行
     文件參數(shù)
     */
    [fileData appendData:[[NSString stringWithFormat:@"--%@",Kboundary] dataUsingEncoding:NSUTF8StringEncoding]];
    [fileData appendData:KNewLine];
    NSString *str = [NSString stringWithFormat:@"Content-Disposition: form-data; name=\"file\"; filename=\"123.png\""];
    [fileData appendData:[str dataUsingEncoding:NSUTF8StringEncoding]];
    [fileData appendData:KNewLine];
    //    application/octet-stream  通用的二進(jìn)制數(shù)據(jù)格式
    [fileData appendData:[@"Content-Type: application/octet-stream" dataUsingEncoding:NSUTF8StringEncoding]];
    [fileData appendData:KNewLine];
    [fileData appendData:KNewLine];
    UIImage *image = [UIImage imageNamed:@"123"];
    NSData *imageData = UIImagePNGRepresentation(image);
    [fileData appendData:imageData];
    [fileData appendData:KNewLine];

    /*
     5.2 拼接非文件參數(shù):
     --分隔符
     Content-Disposition: form-data; name="username"
     空行
     fzgq
     */
    [fileData appendData:[[NSString stringWithFormat:@"--%@",Kboundary] dataUsingEncoding:NSUTF8StringEncoding]];
    [fileData appendData:KNewLine];
    [fileData appendData:[@"Content-Disposition: form-data; name=\"username\"" dataUsingEncoding:NSUTF8StringEncoding]];
    [fileData appendData:KNewLine];
    [fileData appendData:KNewLine];
    [fileData appendData:[@"fzgq" dataUsingEncoding:NSUTF8StringEncoding]];
    [fileData appendData:KNewLine];

    /*
     5.3 結(jié)尾標(biāo)識(shí)
     --分隔符--
     */
    [fileData appendData:[[NSString stringWithFormat:@"--%@--",Kboundary] dataUsingEncoding:NSUTF8StringEncoding]];

    return fileData;
}
補(bǔ)充:如何獲得文件的MIMEType類型

(1)直接對(duì)該對(duì)象發(fā)送一個(gè)異步網(wǎng)絡(luò)請(qǐng)求泛源,在響應(yīng)頭中通過response.MIMEType拿到文件的MIMEType類型

//如果想要及時(shí)拿到該數(shù)據(jù)潭袱,那么可以發(fā)送一個(gè)同步請(qǐng)求
- (NSString *)getMIMEType
{
    NSString *filePath = @"/Users/文頂頂/Desktop/備課/其它/swift.md";

    NSURLResponse *response = nil;
    [NSURLConnection sendSynchronousRequest:[NSURLRequest requestWithURL:[NSURL fileURLWithPath:filePath]] returningResponse:&response error:nil];
    return response.MIMEType;
}

//對(duì)該文件發(fā)送一個(gè)異步請(qǐng)求,拿到文件的MIMEType
- (void)MIMEType
{

    //    NSString *file = @"file:///Users/文頂頂/Desktop/test.png";

    [NSURLConnection sendAsynchronousRequest:[NSURLRequest requestWithURL:[NSURL fileURLWithPath:@"/Users/文頂頂/Desktop/test.png"]] queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse * __nullable response, NSData * __nullable data, NSError * __nullable connectionError) {
        //       response.MIMEType
        NSLog(@"%@",response.MIMEType);

    }];
}

(2)通過UTTypeCopyPreferredTagWithClass方法

//注意:需要依賴于框架MobileCoreServices
- (NSString *)mimeTypeForFileAtPath:(NSString *)path
{
    if (![[[NSFileManager alloc] init] fileExistsAtPath:path]) {
        return nil;
    }

    CFStringRef UTI = UTTypeCreatePreferredIdentifierForTag(kUTTagClassFilenameExtension, (__bridge CFStringRef)[path pathExtension], NULL);
    CFStringRef MIMEType = UTTypeCopyPreferredTagWithClass (UTI, kUTTagClassMIMEType);
    CFRelease(UTI);
    if (!MIMEType) {
        return @"application/octet-stream";
    }
    return (__bridge NSString *)(MIMEType);
    //return NSMakeCollectable(MIMEType);
}
部分文件的MIMEType.png

二甫匹、NSURLSession---Upload(文件上傳)

  • 主要通過NSURLSessionUpLoadTask來上傳,其父類是NSURLSessionTask

  • 文件上傳步驟

    1)確定上傳路徑
    2)創(chuàng)建可變的請(qǐng)求對(duì)象
    3)修改請(qǐng)求方法切POST
    4)設(shè)置請(qǐng)求頭信息(告訴服務(wù)器這是一個(gè)文件上傳請(qǐng)求)
    5)按照固定的格式來拼接參數(shù)(文件參數(shù)&非文件參數(shù)&結(jié)尾標(biāo)識(shí))
    6)創(chuàng)建會(huì)話對(duì)象(session)
    7)根據(jù)會(huì)話對(duì)象創(chuàng)建uploadTask(文件上傳任務(wù))
    8)執(zhí)行uploadTask
    9)解析服務(wù)器返回的數(shù)據(jù)
    說明:
        1)設(shè)置請(qǐng)求頭信息的格式:Content-Type:multipart/form-data; boundary=分隔符
      2)拼接參數(shù)的固定格式
            --分隔符
            Content-Disposition: form-data; name="file"; filename="Snip20160407_10.png"
            Content-Type: image/png
            空行
            文件參數(shù)
            --分隔符
            Content-Disposition: form-data; name="username"
            空行
            非文件參數(shù)
            —分隔符--
    3)可以設(shè)置代理,在代理方法中監(jiān)聽文件上傳的進(jìn)度块攒。

//上傳文件-delegate
-(void)uploadDelegate
{
    //1.創(chuàng)建session
    NSURLSession *session = [NSURLSession sessionWithConfiguration:[NSURLSessionConfiguration defaultSessionConfiguration] delegate:self delegateQueue:[NSOperationQueue mainQueue]];

    //2.創(chuàng)建可變的請(qǐng)求對(duì)象
    NSURL *url =[NSURL URLWithString:@"http://120.25.226.186:32812/upload"];
    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];

    //3.修改請(qǐng)求方法為POST
    request.HTTPMethod = @"POST";

    //4.設(shè)置請(qǐng)求頭信息,告訴服務(wù)器這是一個(gè)上傳請(qǐng)求
    NSString *value  =[NSString stringWithFormat:@"multipart/form-data; boundary=%@",Kboundary];
    [request setValue:value forHTTPHeaderField:@"Content-Type"];

    //5.拼接文件和非文件參數(shù)
    NSData *dataM = [self bodyData];

    //6.根據(jù)session創(chuàng)建uploadTask
    /*
     //PUT
     //    [session uploadTaskWithRequest:<#(nonnull NSURLRequest *)#> fromFile:<#(nonnull NSURL *)#>]
     */
    /*
     第一個(gè)參數(shù):請(qǐng)求對(duì)象(可變)
     第二個(gè)參數(shù):要上傳的文件參數(shù):按照固定的格式拼接
     第三個(gè)參數(shù):completionHandler
     當(dāng)上傳完成之后調(diào)用
     data:服務(wù)器返回給我們的響應(yīng)體信息
     response:響應(yīng)頭
     error:請(qǐng)求失敗,error有值
     */
    NSURLSessionUploadTask *uploadTask =  [session uploadTaskWithRequest:request fromData:dataM completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {

        //8.解析數(shù)據(jù)
        NSLog(@"%@",[[NSString alloc]initWithData:data encoding:NSUTF8StringEncoding]);
    }];

    //7.啟動(dòng)任務(wù)
    [uploadTask resume];
}

/*
 上傳文件的時(shí)候調(diào)用:會(huì)被調(diào)用多次
 bytesSent:本次上傳的文件的大小
 totalBytesSent:已經(jīng)上傳的文件的大小
 totalBytesExpectedToSend:文件的總大小
 */
-(void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task didSendBodyData:(int64_t)bytesSent totalBytesSent:(int64_t)totalBytesSent totalBytesExpectedToSend:(int64_t)totalBytesExpectedToSend
{
    NSLog(@"%f",1.0* totalBytesSent/totalBytesExpectedToSend);
}

//上傳文件-block
-(void)upload
{
    //1.創(chuàng)建session
    NSURLSession *session = [NSURLSession sharedSession];

    //2.創(chuàng)建可變的請(qǐng)求對(duì)象
    NSURL *url =[NSURL URLWithString:@"http://120.25.226.186:32812/upload"];
    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];

    //3.修改請(qǐng)求方法為POST
    request.HTTPMethod = @"POST";

    //4.設(shè)置請(qǐng)求頭信息,告訴服務(wù)器這是一個(gè)上傳請(qǐng)求
    NSString *value  =[NSString stringWithFormat:@"multipart/form-data; boundary=%@",Kboundary];
    [request setValue:value forHTTPHeaderField:@"Content-Type"];

    //5.拼接文件和非文件參數(shù)
    NSData *dataM = [self bodyData];

    //6.根據(jù)session創(chuàng)建uploadTask
    /*
    //PUT
//    [session uploadTaskWithRequest:<#(nonnull NSURLRequest *)#> fromFile:<#(nonnull NSURL *)#>]
    */
    /*
     第一個(gè)參數(shù):請(qǐng)求對(duì)象(可變)
     第二個(gè)參數(shù):要上傳的文件參數(shù):按照固定的格式拼接
     第三個(gè)參數(shù):completionHandler
        當(dāng)上傳完成之后調(diào)用
        data:服務(wù)器返回給我們的響應(yīng)體信息
        response:響應(yīng)頭
        error:請(qǐng)求失敗,error有值
     */
   NSURLSessionUploadTask *uploadTask =  [session uploadTaskWithRequest:request fromData:dataM completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {

        //8.解析數(shù)據(jù)
        NSLog(@"%@",[[NSString alloc]initWithData:data encoding:NSUTF8StringEncoding]);
   }];

    //7.啟動(dòng)任務(wù)
    [uploadTask resume];
}

-(NSData *)bodyData
{
    NSMutableData *fileData = [NSMutableData data];

    /*
     5.1 拼接文件參數(shù):
     --分隔符
     Content-Disposition: form-data; name="file"; filename="123.png"
     Content-Type: application/octet-stream
     空行
     文件參數(shù)
     */
    [fileData appendData:[[NSString stringWithFormat:@"--%@",Kboundary] dataUsingEncoding:NSUTF8StringEncoding]];
    [fileData appendData:KNewLine];
    NSString *str = [NSString stringWithFormat:@"Content-Disposition: form-data; name=\"file\"; filename=\"123.png\""];
    [fileData appendData:[str dataUsingEncoding:NSUTF8StringEncoding]];
    [fileData appendData:KNewLine];
    //    application/octet-stream  通用的二進(jìn)制數(shù)據(jù)格式
    [fileData appendData:[@"Content-Type: application/octet-stream" dataUsingEncoding:NSUTF8StringEncoding]];
    [fileData appendData:KNewLine];
    [fileData appendData:KNewLine];
    UIImage *image = [UIImage imageNamed:@"123"];
    NSData *imageData = UIImagePNGRepresentation(image);
    [fileData appendData:imageData];
    [fileData appendData:KNewLine];

    /*
     5.2 拼接非文件參數(shù):
     --分隔符
     Content-Disposition: form-data; name="username"
     空行
     fzgq
     */
    [fileData appendData:[[NSString stringWithFormat:@"--%@",Kboundary] dataUsingEncoding:NSUTF8StringEncoding]];
    [fileData appendData:KNewLine];
    [fileData appendData:[@"Content-Disposition: form-data; name=\"username\"" dataUsingEncoding:NSUTF8StringEncoding]];
    [fileData appendData:KNewLine];
    [fileData appendData:KNewLine];
    [fileData appendData:[@"fzgq" dataUsingEncoding:NSUTF8StringEncoding]];
    [fileData appendData:KNewLine];

    /*
     5.3 結(jié)尾標(biāo)識(shí)
     --分隔符--
     */
    [fileData appendData:[[NSString stringWithFormat:@"--%@--",Kboundary] dataUsingEncoding:NSUTF8StringEncoding]];

    return fileData;
}

### NSURLConnection---UpLoad(NSURLConnection文件上傳)

- 文件上傳步驟

    (1)確定請(qǐng)求路徑
    (2)根據(jù)URL創(chuàng)建一個(gè)可變的請(qǐng)求對(duì)象
    (3)設(shè)置請(qǐng)求對(duì)象,修改請(qǐng)求方式為POST
    (4)設(shè)置請(qǐng)求頭佃乘,告訴服務(wù)器我們將要上傳文件(Content-Type)
    (5)設(shè)置請(qǐng)求體(在請(qǐng)求體中按照既定的格式拼接要上傳的文件參數(shù)和非文件參數(shù)等數(shù)據(jù))
        001 拼接文件參數(shù)
        002 拼接非文件參數(shù)
        003 添加結(jié)尾標(biāo)記
    (6)使用NSURLConnection sendAsync發(fā)送異步請(qǐng)求上傳文件
    (7)解析服務(wù)器返回的數(shù)據(jù)
  • 文件上傳相關(guān)代碼
/*
上傳文件步驟:
 1.設(shè)置請(qǐng)求頭
    Content-Type:multipart/form-data; boundary=----WebKitFormBoundarygSvklWjpcBBprQ0A
 2.設(shè)置請(qǐng)求體
    按照固定的格式來拼接
 ------WebKitFormBoundarygSvklWjpcBBprQ0A
 Content-Disposition: form-data; name="file"; filename=""
 Content-Type: application/octet-stream

 文件參數(shù)
 ------WebKitFormBoundarygSvklWjpcBBprQ0A
 Content-Disposition: form-data; name="username"

 fzgq
 ------WebKitFormBoundarygSvklWjpcBBprQ0A--

 簡(jiǎn)化拼接格式:
 分隔符:----WebKitFormBoundarygSvklWjpcBBprQ0A
 1.拼接文件參數(shù):
     --分隔符
     Content-Disposition: form-data; name="file"; filename="123.png"
     Content-Type: application/octet-stream
     空行
     文件參數(shù)

2.拼接非文件參數(shù):
     --分隔符
     Content-Disposition: form-data; name="username"
     空行
     fzgq
3.結(jié)尾標(biāo)識(shí)
    --分隔符--
 */
#import "ViewController.h"
#define Kboundary @"----WebKitFormBoundarygSvklWjpcBBprQ0A"
#define KNewLine [@"\r\n" dataUsingEncoding:NSUTF8StringEncoding]



-(void)upload
{
    //1.確定url
    NSURL *url = [NSURL URLWithString:@"http://120.25.226.186:32812/upload"];

    //2.創(chuàng)建可變的請(qǐng)求對(duì)象
    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];

    //3.修改請(qǐng)求方法為POST
    request.HTTPMethod = @"POST";

    //4.設(shè)置請(qǐng)求頭信息
    /*Content-Type:multipart/form-data; boundary=----WebKitFormBoundarygSvklWjpcBBprQ0A*/
    NSString *value  =[NSString stringWithFormat:@"multipart/form-data; boundary=%@",Kboundary];
    [request setValue:value forHTTPHeaderField:@"Content-Type"];

    //5.設(shè)置請(qǐng)求體
    NSMutableData *fileData = [NSMutableData data];

    /*
     5.1 拼接文件參數(shù):
     --分隔符
     Content-Disposition: form-data; name="file"; filename="123.png"
     Content-Type: application/octet-stream
     空行
     文件參數(shù)
     */
    [fileData appendData:[[NSString stringWithFormat:@"--%@",Kboundary] dataUsingEncoding:NSUTF8StringEncoding]];
    [fileData appendData:KNewLine];
    NSString *str = [NSString stringWithFormat:@"Content-Disposition: form-data; name=\"file\"; filename=\"123.png\""];
    [fileData appendData:[str dataUsingEncoding:NSUTF8StringEncoding]];
    [fileData appendData:KNewLine];
//    application/octet-stream  通用的二進(jìn)制數(shù)據(jù)格式
    [fileData appendData:[@"Content-Type: application/octet-stream" dataUsingEncoding:NSUTF8StringEncoding]];
    [fileData appendData:KNewLine];
    [fileData appendData:KNewLine];
    UIImage *image = [UIImage imageNamed:@"123"];
    NSData *imageData = UIImagePNGRepresentation(image);
    [fileData appendData:imageData];
    [fileData appendData:KNewLine];

    /*
     5.2 拼接非文件參數(shù):
     --分隔符
     Content-Disposition: form-data; name="username"
     空行
     fzgq
     */
    [fileData appendData:[[NSString stringWithFormat:@"--%@",Kboundary] dataUsingEncoding:NSUTF8StringEncoding]];
    [fileData appendData:KNewLine];
    [fileData appendData:[@"Content-Disposition: form-data; name=\"username\"" dataUsingEncoding:NSUTF8StringEncoding]];
    [fileData appendData:KNewLine];
    [fileData appendData:KNewLine];
    [fileData appendData:[@"fzgq" dataUsingEncoding:NSUTF8StringEncoding]];
    [fileData appendData:KNewLine];

    /*
     5.3 結(jié)尾標(biāo)識(shí)
     --分隔符--
     */
     [fileData appendData:[[NSString stringWithFormat:@"--%@--",Kboundary] dataUsingEncoding:NSUTF8StringEncoding]];

    //5.4 設(shè)置請(qǐng)求體參數(shù)
    request.HTTPBody = fileData;

    //6.發(fā)送請(qǐng)求s
    [NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse * _Nullable response, NSData * _Nullable data, NSError * _Nullable connectionError) {

        //7.解析返回的數(shù)據(jù)
        NSLog(@"%@",[NSJSONSerialization JSONObjectWithData:data options:kNilOptions error:nil]);
    }];

}

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末囱井,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子趣避,更是在濱河造成了極大的恐慌庞呕,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,402評(píng)論 6 499
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件程帕,死亡現(xiàn)場(chǎng)離奇詭異住练,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)愁拭,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,377評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門讲逛,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人岭埠,你說我怎么就攤上這事盏混。” “怎么了惜论?”我有些...
    開封第一講書人閱讀 162,483評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵许赃,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我馆类,道長(zhǎng)混聊,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,165評(píng)論 1 292
  • 正文 為了忘掉前任乾巧,我火速辦了婚禮句喜,結(jié)果婚禮上僵闯,老公的妹妹穿的比我還像新娘。我一直安慰自己藤滥,他們只是感情好鳖粟,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,176評(píng)論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著拙绊,像睡著了一般向图。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上标沪,一...
    開封第一講書人閱讀 51,146評(píng)論 1 297
  • 那天榄攀,我揣著相機(jī)與錄音,去河邊找鬼金句。 笑死檩赢,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的违寞。 我是一名探鬼主播贞瞒,決...
    沈念sama閱讀 40,032評(píng)論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼趁曼!你這毒婦竟也來了军浆?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,896評(píng)論 0 274
  • 序言:老撾萬榮一對(duì)情侶失蹤挡闰,失蹤者是張志新(化名)和其女友劉穎乒融,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體摄悯,經(jīng)...
    沈念sama閱讀 45,311評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡赞季,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,536評(píng)論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了奢驯。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片申钩。...
    茶點(diǎn)故事閱讀 39,696評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖叨橱,靈堂內(nèi)的尸體忽然破棺而出典蜕,到底是詐尸還是另有隱情,我是刑警寧澤罗洗,帶...
    沈念sama閱讀 35,413評(píng)論 5 343
  • 正文 年R本政府宣布,位于F島的核電站钢猛,受9級(jí)特大地震影響伙菜,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜命迈,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,008評(píng)論 3 325
  • 文/蒙蒙 一贩绕、第九天 我趴在偏房一處隱蔽的房頂上張望火的。 院中可真熱鬧,春花似錦淑倾、人聲如沸馏鹤。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽湃累。三九已至,卻和暖如春碍讨,著一層夾襖步出監(jiān)牢的瞬間治力,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,815評(píng)論 1 269
  • 我被黑心中介騙來泰國打工勃黍, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留宵统,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,698評(píng)論 2 368
  • 正文 我出身青樓覆获,卻偏偏與公主長(zhǎng)得像马澈,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子弄息,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,592評(píng)論 2 353

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