本文根据另一份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 = [superinit];
if (self) {
randomIDStr =@"----------thinkyouitcast---------";
uploadID =@"uploadFile";
}
return self;
}
#pragma mark - 私有方法
- (NSString *)topStringWithMimeType:(NSString *)mimeType uploadFile:(NSString *)uploadFile
{
NSMutableString *strM = [NSMutableStringstring];
[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 = [NSMutableStringstring];
[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 = [selftopStringWithMimeType:@"image/png"uploadFile:@"头像1.png"];
NSString *bottomStr = [selfbottomString];
NSMutableData *dataM = [NSMutableDatadata];
[dataM appendData:[topStrdataUsingEncoding:NSUTF8StringEncoding]];
[dataM appendData:data];
[dataM appendData:[bottomStrdataUsingEncoding:NSUTF8StringEncoding]];
// 1. Request
NSMutableURLRequest *request = [NSMutableURLRequestrequestWithURL:url cachePolicy:0timeoutInterval:2.0f];
// dataM出了作用域就会被释放,因此不用copy
request.HTTPBody = dataM;
// 2> 设置Request的头属性
request.HTTPMethod = @"POST";
// 3> 设置Content-Length
NSString *strLength = [NSStringstringWithFormat:@"%ld", (long)dataM.length];
[request setValue:strLength forHTTPHeaderField:@"Content-Length"];
// 4> 设置Content-Type
NSString *strContentType = [NSStringstringWithFormat:@"multipart/form-data; boundary=%@",randomIDStr];
[request setValue:strContentType forHTTPHeaderField:@"Content-Type"];
// 3> 连接服务器发送请求
[NSURLConnection sendAsynchronousRequest:request queue:[[NSOperationQueuealloc] init]completionHandler:^(NSURLResponse *response,NSData *data, NSError *connectionError) {
// NSString *result = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
// NSLog(@"%@", result);
handler(response,data,connectionError);
}];
}