您的位置:首页 > 移动开发 > Swift

swift 上传文件到服务器

2015-11-13 16:15 351 查看

本文根据另一份OC上传文件的代码改写而来

改写后的 swift 代码如下

//MARK: UploadFile

class UploadFile {

//
拼接字符串

let boundaryStr =
"--" // 分隔字符串

let randomIDStr =
"----------thinkyouitcast---------" //
本次上传标示字符串

let uploadID =
"uploadFile"
// 上传(php)脚本中,接收文件字段

private func topStringWithMimeType(mimeType:
String, uploadFile:
String)->String{

let strM =
NSMutableString()

strM.appendString("\(boundaryStr)\(randomIDStr)\n")

strM.appendString("Content-Disposition: form-data; name=\"\(uploadID)\"; filename=\"\(uploadFile)\"\n")

strM.appendString("Content-Type:
\(mimeType)\n\n")

return strM
as String

}

private func bottomString()->String{

let strM =
NSMutableString()

strM.appendString("\(boundaryStr)\(randomIDStr)\n")

strM.appendString("Content-Disposition: form-data; name=\"submit\"\n\n")

strM.appendString("Submit\n")

strM.appendString("\(boundaryStr)\(randomIDStr)--\n")

return strM
as String

}

//MARK:
上传文件

func uploadFileWithURL(url:
NSURL, data: NSData, completionHandler handler:((response:
NSURLResponse?, data:
NSData?, connetionError: NSError?) ->
Void)){

// 1>
数据体

let topStr:
NSString = self.topStringWithMimeType("image/png", uploadFile:
"头像1.png")

let bottomStr:
NSString = self.bottomString()

let dataM =
NSMutableData()

dataM.appendData(topStr.dataUsingEncoding(NSUTF8StringEncoding)!)

dataM.appendData(data)

dataM.appendData(bottomStr.dataUsingEncoding(NSUTF8StringEncoding)!)

// 1.Request

let request =
NSMutableURLRequest(URL: url, cachePolicy: NSURLRequestCachePolicy.UseProtocolCachePolicy, timeoutInterval:
2.0)

// dataM出了作用域就会被释放,因此不用copy

request.HTTPBody = dataM

// 2>
设置Request的头属性

request.HTTPMethod =
"POST"

// 3>
设置Content-Length

let strLength =
"\(data.length)"

request.setValue(strLength, forHTTPHeaderField:
"Content-Length")

// 4>
设置Content-Type

let strContentType =
"multipart/form-data; boundary=\(randomIDStr)"

request.setValue(strContentType, forHTTPHeaderField:
"Content-Type")

// 3>
连接服务器发送请求

let task =
NSURLSession.sharedSession().dataTaskWithRequest(request) { (data, response, error) ->
Void in

handler(response: response, data: data, connetionError: error)

}

task.resume()

//@available(iOS, introduced=5.0, deprecated=9.0, message="Use [NSURLSession dataTaskWithRequest:completionHandler:] (see NSURLSession.h")

// NSURLConnection.sendAsynchronousRequest(<#T##request: NSURLRequest##NSURLRequest#>, queue: <#T##NSOperationQueue#>, completionHandler: <#T##(NSURLResponse?, NSData?, NSError?) -> Void#>)

}

}

// 测试

func test(){

let url = ("http://***.com/api/crmUpFile.ashx")

let image =
UIImage(named:
"ic_background_320_230")

let imageData =
UIImagePNGRepresentation(image!)

UploadFile().uploadFileWithURL(NSURL(string: url)!, data: imageData!) { (response, data, error) ->
Void in

let str =
NSString(data: data!, encoding: NSUTF8StringEncoding)

print("\(str)")

}

}

原OC代码也贴在此

@interface UploadFile :
NSObject

- (void)uploadFileWithURL:(NSURL *
_Nonnull)url data:(NSData *
_Nonnull)data

completionHandler:(void (^
__nullable)(NSURLResponse*
__nullable response, NSData*
__nullable data, NSError*
__nullable connectionError)) handler;

@end

@implementation UploadFile

// 拼接字符串

static NSString *boundaryStr =
@"--"; //
分隔字符串

static NSString *randomIDStr;
// 本次上传标示字符串

static NSString *uploadID;
// 上传(php)脚本中,接收文件字段

- (instancetype)init

{

self = [super
init];

if (self) {

randomIDStr =
@"----------thinkyouitcast---------";

uploadID =
@"uploadFile";

}

return
self;

}

#pragma mark - 私有方法

- (NSString *)topStringWithMimeType:(NSString *)mimeType uploadFile:(NSString *)uploadFile

{

NSMutableString *strM = [NSMutableString
string];

[strM appendFormat:@"%@%@\n",
boundaryStr, randomIDStr];

[strM appendFormat:@"Content-Disposition: form-data; name=\"%@\"; filename=\"%@\"\n",
uploadID, uploadFile];

[strM appendFormat:@"Content-Type: %@\n\n", mimeType];

// NSLog(@"%@", strM);

return [strM copy];

}

- (NSString *)bottomString

{

NSMutableString *strM = [NSMutableString
string];

[strM appendFormat:@"%@%@\n",
boundaryStr, randomIDStr];

[strM appendString:@"Content-Disposition: form-data; name=\"submit\"\n\n"];

[strM appendString:@"Submit\n"];

[strM appendFormat:@"%@%@--\n",
boundaryStr, randomIDStr];

// NSLog(@"%@", strM);

return [strM copy];

}

#pragma mark - 上传文件

- (void)uploadFileWithURL:(NSURL *)url data:(NSData *)data

completionHandler:(void (^)(NSURLResponse*
__nullable response,
NSData* __nullable data,
NSError* __nullable connectionError)) handler {

// 1>
数据体

NSString *topStr = [self
topStringWithMimeType:@"image/png"
uploadFile:@"头像1.png"];

NSString *bottomStr = [self
bottomString];

NSMutableData *dataM = [NSMutableData
data];

[dataM appendData:[topStr
dataUsingEncoding:NSUTF8StringEncoding]];

[dataM appendData:data];

[dataM appendData:[bottomStr
dataUsingEncoding:NSUTF8StringEncoding]];

// 1. Request

NSMutableURLRequest *request = [NSMutableURLRequest
requestWithURL:url cachePolicy:0
timeoutInterval:2.0f];

// dataM出了作用域就会被释放,因此不用copy

request.HTTPBody = dataM;

// 2>
设置Request的头属性

request.HTTPMethod =
@"POST";

// 3>
设置Content-Length

NSString *strLength = [NSString
stringWithFormat:@"%ld", (long)dataM.length];

[request setValue:strLength
forHTTPHeaderField:@"Content-Length"];

// 4>
设置Content-Type

NSString *strContentType = [NSString
stringWithFormat:@"multipart/form-data; boundary=%@",
randomIDStr];

[request setValue:strContentType
forHTTPHeaderField:@"Content-Type"];

// 3>
连接服务器发送请求

[NSURLConnection
sendAsynchronousRequest:request queue:[[NSOperationQueue
alloc] init]
completionHandler:^(NSURLResponse *response,
NSData *data, NSError *connectionError) {

// NSString *result = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];

// NSLog(@"%@", result);

handler(response,data,connectionError);

}];

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: