美文网首页程序员
AFNetworking下载文件时文件名长度的坑

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

作者: 莫云溪 | 来源:发表于2018-03-28 22:21 被阅读0次

背景

最近遇到一个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;

欢迎关注我的博客

相关文章

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

    背景 最近遇到一个Bug,在用AFNetworking下载文件的时候莫名其妙的失败了,跟了一下发现一个小坑,记录一...

  • iOS采坑记录

    采坑记录 iOS 通过 Webview点击下载链接问题 Webview点击下载链接,需要通过文件名下载文件,需要通...

  • AFNetworking下载,设置请求头

    使用AFNetworking下载文件时,为期设置请求头,如下:

  • java文件下载中文文件名乱码

    java文件下载中文文件名乱码 JAVA文件下载时中文文件名乱码有两种情况: 1、下载时中文文件名乱码; 2、下载...

  • iOS 使用AFNetWorking下载文件

    使用AFNetWorking下载文件时,需要包含AFNetWorking框架(使用的是2.3.0版本) 当只需单个...

  • AFNetworking的简单封装

    AFNetworking下载地址: AFNetworking 1.导入AFNetworking文件 2.实现的功能...

  • 文件管理

    文件名命名规则 文件名大小写敏感 文件名可以使用除/以外的任意字符 文件名长度不能超过255字符 以.开头的文件为...

  • 用 Python 修改下载文件名乱码

    用 Python 修改下载文件名乱码 从互联网下载带有中文名称的文件,下载的文件名中有可能会带有乱码。文件名的乱码...

  • 超链接下载文件--重命名

    需求:超链接 下载文件, 希望地址中的文件名和下载后的文件名不一样。 场景:用户上传文件,为了防止文件名重复,所以...

  • 与文件相关的操作命令

    文件操作命令 cp mv ln Cat (more) rm 1 文件名及其规范 1)文件名的长度:短文件系统最长字...

网友评论

    本文标题:AFNetworking下载文件时文件名长度的坑

    本文链接:https://www.haomeiwen.com/subject/wrcpcftx.html