iOS文件上传功能

836 阅读2分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第6天,点击查看活动详情

背景

  • 普通的文件上传功能,用户上传图像,图片从本地相册获取,比较简单的一个功能也困扰了我半天。接口文档里面测试选择本地文件很正常的请求成功,但是我每次都是请求失败。服务端手上事情也比较多,只能自己慢慢摸索

解决方案

  • 图片上传很容易想到的方式

  • 1.文件二进制流上传

  • 2.转成base64字符串进行上传

  • 接口用的就是二进制formdata进行上传的 需要设置的就是request 请求头的content-type multipart/form-data boundary=--xxxxx

  • 拼接body 发送请求就OK。看这么多第三方库也都封装好了, 直接用AFNetworking


+ (**void**)upLoadFile:(NSString *)urlString image:(UIImage *)image ifsuccess:(**void**(^)(**id** response))success ifFailed:(**void**(^)(NSError *error))failed{

    

    AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];

    manager.responseSerializer.acceptableContentTypes = [NSSet setWithObjects:@"application/json",@"text/html",@"text/json",@"text/javascript",@"image/jpeg",@"image/png",**nil**];

    [manager.requestSerializer setValue:@"multipart/form-data" forHTTPHeaderField:@"Content-Type"];

    NSData *data = UIImageJPEGRepresentation(image, 1.0f);

    NSDictionary *headerDict = [**self** gjHTTPHeader];

    

    [manager POST:urlString parameters:**nil** headers:headerDict constructingBodyWithBlock:^(**id**<AFMultipartFormData>  **_Nonnull** formData) {

        [formData appendPartWithFileData:data name:@"file" fileName:@"image.png" mimeType:@"image/png"];

    } progress:^(NSProgress * **_Nonnull** uploadProgress) {

        //

    } success:^(NSURLSessionDataTask * **_Nonnull** task, **id**  **_Nullable** responseObject) {

        success(responseObject);

    } failure:^(NSURLSessionDataTask * **_Nullable** task, NSError * **_Nonnull** error) {

        failed(error);

    }];

}

  • 需要注意的就是 formdata append的时候, name--是接口的字段名, filename是传到服务端的文件名。调了半天最后竟然是因为服务端校验了filename的后缀, 导致一直给我报错。所以一个简单的功能,用第三方,自己用原生拼接,网上查资料,反反复复实现了很多遍,最后我确定自己的方法没问题之后, 给服务端的同学装了一个demo,等他空下来 自己调试一下,才找到问题

总结

  • 功能不难,但是遇到问题,可以帮助我们了解更多相关的知识。另一个遇事多沟通,工作中还是脸皮厚一点,明显一开始就找服务端看日志,问题也能很快解决。但是就因为我们不太愿意麻烦别人导致消耗了自己的时间。最重要的一点就是知识不够深,导致我没自信一开始就怀疑服务端在其他方面给了报错。小问题花了不对等的时间,所以特此记录一下