swift 上传文件到服务器

本文根据另一份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);

    }];

}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值