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
    评论
在Ceph系统中,可以通过封装的cephSwiftOperator来实现对Swift对象存储进行文件上传操作。根据引用,ceph支持文件流和字节数组方式传递文件。对于文件不是很大的情况,可以直接采用字节数组方式进行上传。 根据引用,在云计算项目交付中,如果需要将按照文件夹分类的若干原始文件自动压缩打包上传到Swift对象存储中,可以使用Swift的API请求来实现。通过获取不同文件夹对应的类别、文件名称、文件描述等信息,可以将文件按照要求自动上传到Swift对象存储中。 而根据引用,为了使得程序更具有通用性和简单性,可以选择使用curl来进行Swift的API请求,以实现对文件及容器的增删改查操作。 因此,要实现Swift上传文件的操作,可以使用cephSwiftOperator封装的API请求,通过字节数组方式或者文件流方式传递文件,并根据需求获取文件的相关信息进行上传。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [智牛股_第9章_CEPH_Swift+文件上传与下载](https://blog.csdn.net/guan1843036360/article/details/128414864)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* *3* [openstack对象存储系统之swift项目实战自动化压缩和上传文件(三)](https://blog.csdn.net/u014374009/article/details/118566048)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值