• 薛定谔的文件上传


    一、场景

    移动端开发文件上传功能, 安卓和苹果端都已经开发完成,在调试的过程中,发现苹果端图片上传后有时候会出现中间某些像素受损的情况。

     

    二、问题分析

    1、先从源文件来分析,xcode从沙盒导出原图文件,正常;

    2、是否压缩过程中有问题,将源zip文件导出,解压后查看文件也是正常;

    3、是否后端接收文件处理问题,但是接收的额文件大小字节数和源文件一模一样,刚开始怀疑OSS文件存储问题,于是在后台自己拦截,将文件写入到本地,发现同样存在问题,于是最终将后台存储这块的嫌疑排除。

    4、开始怀疑移动端的接口问题,于是陷入了长期的调试AFNetworking 框架接口使用过程中, 由于问题是随机出现的,有时候传输正常,有时候会有像素受损,这就导致在调试的过程中偶尔做了少许的改动后,会误以为是自己改好了,但是多试了几次以后,发现问题又出现了,就这样,反复在希望和失望中反复徘徊,最终几乎崩溃。

    中途将zip文件传输改为单个图片文件上传的过程中,发现了同一张图片经过两次不同的传输效果会不同,当时已经怀疑是否是网络传输问题了,但是想着http 传输不应该会出现问题。

    期间一直在调试纠结 AFMultipartFormData 这个的使用:

    考虑过图片压缩方式修改,更换沙盒目录到document,直接使用苹果自带的NSURLSession来上传等等方式都没有效果,问题有时候看起来不出现了,但是有时候又冒出来了。

    在请教其他人之后,有一次尝试了,将参数mimeType 修改为代码获取(最终输出的日志显示也和自己调试时写死的字符串一样)后,连续试了几次居然都是上传正常的,当时一阵狂喜,感觉是不是就是这个问题造成,但是还是有之前调试的现象无法用这个修改来解释,但是由于挫败了太久,自己还是选择相信问题解决了。

    - (NSString *)fileMIMETypeURLSessionWithPath:(NSString*)path {

    //1.确定请求路径

    NSURL *url = [NSURL fileURLWithPath:path];

    //2.创建可变的请求对象

    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];

    dispatch_semaphore_t semaphore = dispatch_semaphore_create(0);

    __block NSString *mimeType = nil;

    NSURLSessionTask *task = [[NSURLSession sharedSession] dataTaskWithRequest:request completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {

    mimeType = response.MIMEType;

    dispatch_semaphore_signal(semaphore);

    }];

    [task resume];

    dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);

    return mimeType;

    }

    然而当过了一天之后,再次用同样的代码运行,问题又出现了,当时自己都冒出一身冷汗,难道是量子纠缠,仿佛自己遇到了三体里面那些做物理实验的科学家的场景,由于被智子干扰将人类基础科学锁死,科学家做出的实验结果充满了各种离奇的数据,而我看到的这个图片上的像素被修改的点,真有如小说中描述的一般。

    三、突破

    由于在工作日分析这个问题的时候,经常被其他问题中断。于是周末选择来加班,在一个午后,开始决定抓包来对比正常和异常图片的数据有何差异,当打开fiddler时,手机需要连接代理网络,于是将平时调试连接的WiFi 切换了一下,神奇的事情发生了,我测试了十几次,想抓取异常图片数据包,然后每次看到的图片都是正常的。在经历了多次测试,以及切换回之前的那个网络对比测试之后,我渐渐怀疑是不是就是因为网路的问题。越往这条路上想,之前的异像也越发合理起来,但是由于之前的调试过程中希望和失望的反复挫败感,让自己还是不敢确定。直到反复对比测试,将问题弄成必现之后,才定下心来。没错,就是网路传输中出现问题了,但是那个有问题的wifi 为什么会出现这种情况,自己仍然不清楚。而且后续又用其他应用使用那个网络进行文件传输,也没有发现有问题,所以困扰了自己将近两个星期的薛定谔文件上传问题算是告一段落。

     

  • 相关阅读:
    分子动力学模拟算法框架
    在Windows上使用.NET部署到Docker 《让孩子们走出大坑》
    Rust的枚举类型和模式匹配
    Java8 yyyy/MM/dd和uuuu/MM/dd的不同
    微信照片过期打不开怎么办?用这个办法可找回
    测评补单:Temu卖家的市场攻略,轻松吸引更多流量和转化!
    数据仓库概念
    Redis Cluster集群环境搭建
    文件预览(img,doc,pdf,xls)
    配置centos 4.4.7 服务器(5)
  • 原文地址:https://blog.csdn.net/yangwubolwg/article/details/127727123