swift 上传文件到服务器
2015-11-13 16:15
351 查看
本文根据另一份OC上传文件的代码改写而来
改写后的 swift 代码如下
//MARK: UploadFileclass 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);
}];
}
相关文章推荐
- Swift Protocol optional
- Swift函数
- Swift
- swift sqlite3使用
- Swift Literal Convertibles
- swift之数组(Array)、集合(Set)、字典(Dictionary)
- swift之可选类型
- [IOSS]Swift数据类型转换
- Swift Selector
- 《从零开始学Swift》学习笔记(Day 35)——会使用下标吗?
- oc与swift混编,OC调用swift,swift调用OC
- 《从零开始学Swift》学习笔记(Day 35)——会使用下标吗?
- swift 内存管理
- Swift&nbsp;编程语言入门教程
- added wide keds taylor swift foot
- About Swift
- OC/Swift第三方添加出错解决方法
- swift 快速奔跑的兔几 本节的内容是:音频与视频 第一说 AVFoundation 以及简单的iOS视频app
- Swift 类的初始化和反初始化
- Swift——Command failed due to signal: Segmentation fault: 11