AFNetworking下载文件时文件名长度的坑

简介: 背景最近遇到一个Bug,在用AFNetworking下载文件的时候莫名其妙的失败了,跟了一下发现一个小坑,记录一下防止以后再掉进去。iOS和Linux的文件名的长度限制相同都是255个字符!!!问题根源是文件名超度超过了255个字符,AFNe...

背景

最近遇到一个Bug,在用AFNetworking下载文件的时候莫名其妙的失败了,跟了一下发现一个小坑,记录一下防止以后再掉进去。

iOS和Linux的文件名的长度限制相同都是255个字符!!!

问题根源是文件名超度超过了255个字符,AFNetworking下载文件是成功了(框架会把文件下载到一个临时文件,例如:CFNetworkDownload_xxx.tmp,这个文件名不会出现过长的问题),下载成功之后会copy到调用者指定路径,在这里指定的文件名超过了255个字符,导致创建文件失败,于是回调是成功了,但是在设置的路径找不到这个文件。

上代码!

下载代码:

// 注意对文件名长度进行处理!!!
NSString *destination = @"下载地址(长度大于255)";
NSURLSessionDownloadTask *aTask = [self.updownloadSessionManager downloadTaskWithRequest:mutableRequest progress:^(NSProgress * _Nonnull downloadProgress) {
        
    } destination:^NSURL * _Nonnull(NSURL * _Nonnull targetPath, NSURLResponse * _Nonnull response) {
        return [NSURL fileURLWithPath:destination];
    } completionHandler:^(NSURLResponse * _Nonnull response, NSURL * _Nullable filePath, NSError * _Nullable error) {
        // 下载成功后会回调该block,但是路径`destination`找不到这个文件
    }];
    [aTask resume];

出错的地方AFURLSessionManager.m

- (void)URLSession:(NSURLSession *)session
      downloadTask:(NSURLSessionDownloadTask *)downloadTask
didFinishDownloadingToURL:(NSURL *)location
{
    self.downloadFileURL = nil;

    if (self.downloadTaskDidFinishDownloading) {
        self.downloadFileURL = self.downloadTaskDidFinishDownloading(session, downloadTask, location);
        if (self.downloadFileURL) {
            NSError *fileManagerError = nil;

            // location是临时文件,是下载成功了
            // self.downloadFileURL 是目标路径,文件名超过255
            // 移动文件会报错
            if (![[NSFileManager defaultManager] moveItemAtURL:location toURL:self.downloadFileURL error:&fileManagerError]) {
            // 出错会发通知,可以监听处理
                [[NSNotificationCenter defaultCenter] postNotificationName:AFURLSessionDownloadTaskDidFailToMoveFileNotification object:downloadTask userInfo:fileManagerError.userInfo];
            }
        }
    }
}

我们来看看AFURLSessionDownloadTaskDidFailToMoveFileNotification的定义
AFURLSessionManager.h

/**
 Posted when a session download task encountered an error when moving the temporary download file to a specified destination.
 */
FOUNDATION_EXPORT NSString * const AFURLSessionDownloadTaskDidFailToMoveFileNotification;
目录
相关文章
|
域名解析 Cloud Native Java
重磅官宣:Nacos2.0 发布,性能提升 10 倍
继 Nacos 1.0 发布以来,Nacos 迅速被成千上万家企业采用,并构建起强大的生态。但是随着用户深入使用,逐渐暴露一些性能问题,因此我们启动了 Nacos 2.0 的隔代产品设计,时隔半年我们终于将其全部实现,实测性能提升 10 倍,相信能满足所有用户的性能需求。下面由我代表社区为大家介绍一下这款跨代产品。
重磅官宣:Nacos2.0 发布,性能提升 10 倍
|
编解码 图计算 iOS开发
iPhone手机屏幕尺寸与倍图计算公式(更新至iPhone 14 Plus)
iPhone手机屏幕尺寸与倍图计算公式(更新至iPhone 14 Plus)
678 0
|
安全 网络协议 数据安全/隐私保护
2020苹果审核被拒绝原因汇总
2020苹果审核被拒绝原因汇总
897 0
|
机器学习/深度学习 安全 算法
利用机器学习优化网络安全防御策略
【6月更文挑战第3天】随着网络攻击的日益猖獗,传统的安全防御机制已难以满足企业对数据保护的需求。本文探讨如何应用机器学习技术来预测和防御潜在的网络安全威胁,通过分析历史数据模式,自动调整安全策略,从而在不断变化的威胁环境中保持企业的网络安全。
《QT从基础到进阶·二十五》界面假死处理
《QT从基础到进阶·二十五》界面假死处理
359 0
《QT从基础到进阶·二十五》界面假死处理
|
Web App开发 编解码 前端开发
更专业省心的来了,你没必要研究UE4和Unity官方推流了!
需求催生了一种新的“云渲染”方案,将庞大负载的“渲染”放到云端强大算力的服务器去执行,前端仅仅是展示和交互。 本文小编介绍了目前主流的3种方案,如果你感兴趣的话一起看看吧~
更专业省心的来了,你没必要研究UE4和Unity官方推流了!
|
消息中间件 存储 缓存
代码项目中的超买超卖问题
超买超卖问题在代码项目中是一个常见的挑战,它指的是资源的不平衡或使用不当,导致某些资源过度使用或过度消耗的情况。这可能导致系统性能下降、响应时间延长或崩溃等问题。在本篇博客中,我将介绍超买超卖问题的背景和原因,并提供一些解决方案来优化代码项目的性能和稳定性。
435 1
|
Web App开发 存储 Linux
Linux C/C++开发(后端/音视频/游戏/嵌入式/高性能网络/存储/基础架构/安全)(下)
Linux C/C++开发(后端/音视频/游戏/嵌入式/高性能网络/存储/基础架构/安全)
|
存储 编解码 语音技术
swr_get_out_samples和swr_convert,比特率重采样
swr_get_out_samples和swr_convert,比特率重采样
414 0
swr_get_out_samples和swr_convert,比特率重采样
|
算法
优化算法——全局灵敏度分析算法(PAWN )(Matlab代码实现)
优化算法——全局灵敏度分析算法(PAWN )(Matlab代码实现)
405 0