薛定谔的文件上传

一、场景

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

 

二、问题分析

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 为什么会出现这种情况,自己仍然不清楚。而且后续又用其他应用使用那个网络进行文件传输,也没有发现有问题,所以困扰了自己将近两个星期的薛定谔文件上传问题算是告一段落。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值