標籤:檔案上傳 請求 參數 body 開發
檔案上傳的步驟
1.佈建要求頭
* 目的:告訴伺服器請求體裡面的內容並非普通的參數,而是包含了檔案參數
[request setValue:@"multipart/form-data; boundary=maljob" forHTTPHeaderField:@"Content-Type"];
2.佈建要求體
* 作用:存放參數(檔案參數和非檔案參數)
1> 非檔案參數
[body appendData:MalJobEncode(@"--maljob\r\n")];[body appendData:MalJobEncode(@"Content-Disposition: form-data; name=\"username\"\r\n")];
[body appendData:MalJobEncode(@"\r\n")];[body appendData:MalJobEncode(@"張三")];[body appendData:MalJobEncode(@"\r\n")];
2> 檔案參數
[body appendData:MalJobEncode(@"--heima\r\n")];[body appendData:MalJobEncode(@"Content-Disposition: form-data; name=\"file\"; filename=\"test123.png\"\r\n")];[body appendData:MalJobEncode(@"Content-Type: image/png\r\n")];
[body appendData:MalJobEncode(@"\r\n")];[body appendData:imageData];[body appendData:MalJobEncode(@"\r\n")];
3> 結束標記 :參數結束的標記
[body appendData:MalJobEncode(@"--maljob--\r\n")];
檔案的MIMEType
1.百度搜尋
2.尋找伺服器下面的某個xml檔案
apache-tomcat-6.0.41\conf\web.xml
3.負載檔案時通過Reponse獲得
- (NSString *)MIMEType:(NSURL *)url{ // 1.建立一個請求 NSURLRequest *request = [NSURLRequest requestWithURL:url]; // 2.發送請求(返迴響應) NSURLResponse *response = nil; [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:nil]; // 3.獲得MIMEType return response.MIMEType;}
檔案上傳封裝工具類
@interface UploadTool : NSObject/** * 根據檔案路徑擷取檔案的MIMEType * * @param url 檔案路徑 * * @return 檔案MIMEType */- (NSString *)MIMEType:(NSURL *)url;/** * 根據檔案名稱、MIMEType、二進位檔案、其他的參數上傳檔案 * * @param filename 檔案名稱 * @param mimeType MIMEType * @param fileData 二進位檔案 * @param params 非檔案的其他詳細參數 */- (void)upload:(NSString *)filename mimeType:(NSString *)mimeType fileData:(NSData *)fileData params:(NSDictionary *)params;@end
#define MJFileBoundary @"MalJob"#define MJNewLine @"\r\n"#define MJEncode(str) [str dataUsingEncoding:NSUTF8StringEncoding]#import "UploadTool.h"@implementation UploadTool- (NSString *)MIMEType:(NSURL *)url{ // 1.建立一個請求 NSURLRequest *request = [NSURLRequest requestWithURL:url]; // 2.發送請求(返迴響應) NSURLResponse *response = nil; [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:nil]; // 3.獲得MIMEType return response.MIMEType;}- (void)upload:(NSString *)filename mimeType:(NSString *)mimeType fileData:(NSData *)fileData params:(NSDictionary *)params{ // 1.請求路徑 NSURL *url = [NSURL URLWithString:@"http://218.83.161.124:8080/job/upload"]; // 2.建立一個POST請求 NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url]; request.HTTPMethod = @"POST"; // 3.佈建要求體 NSMutableData *body = [NSMutableData data]; // 3.1.檔案參數 [body appendData:MJEncode(@"--")]; [body appendData:MJEncode(MJFileBoundary)]; [body appendData:MJEncode(MJNewLine)]; NSString *disposition = [NSString stringWithFormat:@"Content-Disposition: form-data; name=\"file\"; filename=\"%@\"", filename]; [body appendData:MJEncode(disposition)]; [body appendData:MJEncode(MJNewLine)]; NSString *type = [NSString stringWithFormat:@"Content-Type: %@", mimeType]; [body appendData:MJEncode(type)]; [body appendData:MJEncode(MJNewLine)]; [body appendData:MJEncode(MJNewLine)]; [body appendData:fileData]; [body appendData:MJEncode(MJNewLine)]; // 3.2.非檔案參數 [params enumerateKeysAndObjectsUsingBlock:^(id key, id obj, BOOL *stop) { [body appendData:MJEncode(@"--")]; [body appendData:MJEncode(MJFileBoundary)]; [body appendData:MJEncode(MJNewLine)]; NSString *disposition = [NSString stringWithFormat:@"Content-Disposition: form-data; name=\"%@\"", key]; [body appendData:MJEncode(disposition)]; [body appendData:MJEncode(MJNewLine)]; [body appendData:MJEncode(MJNewLine)]; [body appendData:MJEncode([obj description])]; [body appendData:MJEncode(MJNewLine)]; }]; // 3.3.結束標記 [body appendData:MJEncode(@"--")]; [body appendData:MJEncode(MJFileBoundary)]; [body appendData:MJEncode(@"--")]; [body appendData:MJEncode(MJNewLine)]; request.HTTPBody = body; // 4.佈建要求頭(告訴伺服器這次傳給你的是檔案資料,告訴伺服器現在發送的是一個檔案上傳請求) NSString *contentType = [NSString stringWithFormat:@"multipart/form-data; boundary=%@", MJFileBoundary]; [request setValue:contentType forHTTPHeaderField:@"Content-Type"]; // 5.發送請求 [NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) { NSDictionary *dict = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableLeaves error:nil]; MalJobLog(@"%@", dict); }];}- (void)upload{ // 非檔案的其他詳細參數 NSDictionary *params = @{ @"" : @"", @"" : @"", }; NSURL *url = [[NSBundle mainBundle] URLForResource:@"filename" withExtension:@"txt"]; NSData *data = [NSData dataWithContentsOfURL:url]; NSString *MIMEType = [self MIMEType:url]; [self upload:@"filename.txt" mimeType:MIMEType fileData:data params:params];}
iOS開發 - 封裝檔案上傳工具類