Alamofire下载问题

时间:2016-09-14 12:23:51

标签: swift alamofire

我正在尝试使用带有Xcode 8.0和Swift 3.0的Alamofire 4.0.0在我的代码中下载this picture

这是我的要求:

 extension String
    {   
        func encodeUrl() -> String
        {
            return self.addingPercentEncoding( withAllowedCharacters: .urlQueryAllowed)
        }
    func decodeUrl() -> String
        {
            return self.stringByRemovingPercentEncoding
        }

    }

我从服务器得到以下答案:

  

FAILURE:   responseSerializationFailed(Alamofire.AFError.ResponseSerializationFailureReason.inputFileReadFailed(文件:///private/var/mobile/Containers/Data/Application/50400F41-47FD-4276-8903-F48D942D064A/tmp/CFNetworkDownload_D1Aqkh.tmp))

我对如何解决这个问题一无所知...... Alamofire新版本是否存在某些问题,还是我忘了某些地方?

谢谢!

1 个答案:

答案 0 :(得分:29)

Official answer from cnoon (Alamofire member):

  

嗨@Tulleb,

     

抱歉不早点回复你。示例@katopz是   不是同一类型的请求。该示例演示了如何使用   数据任务,而不是下载任务。如果你不想下载   文件,您可以改为执行以下操作:

Alamofire.request(url).responseData { response in
     guard let data = response.result.value else { return }
     let image = UIImage(data: data)
     print(image)
}
     

但是,要回答您的原始问题,您将遇到沙箱权限问题。我们允许你使用   下载API而不指定操作的目标闭包   像macOS这样的系统,您可以在其中访问自己的文件   沙箱。但是,在iOS上,您无法直接访问数据   文件位于沙箱之外。这就是你看到的原因   .inputFileReadFailed错误。

     

有几种方法可以解决这个问题。

     

选项1

     

您可以使用请求API下载数据,如上所示   将图像数据下载到内存中,而不是下载到磁盘上。

     

选项2

     

您可以在访问数据之前将文件移动到沙箱中   使用目的地闭包。以下是如何执行此操作的示例:

let destination: DownloadRequest.DownloadFileDestination = { _, _ in
let documentsPath = NSSearchPathForDirectoriesInDomains(.documentDirectory,
.userDomainMask, true)[0]
let documentsURL = URL(fileURLWithPath: documentsPath, isDirectory: true)
let fileURL = documentsURL.appendingPathComponent("image.png")

return (fileURL, [.removePreviousFile, .createIntermediateDirectories]) }

Alamofire.download("https://httpbin.org/image/png", to:
destination).responseData { response in
    debugPrint(response)

    if let data = response.result.value {
        let image = UIImage(data: data)
        print(image)
    } else {
        print("Data was invalid")
    }
}
     

//输出:

     

// [请求]:https://httpbin.org/image/png // [回复]:    {URL:https://httpbin.org/image/png   } {status code:200,headers {//“Access-Control-Allow-Origin”=   “*”; //“Content-Length”= 8090; //“Content-Type”=   “图像/ PNG”; // Date =“Sat,2016年9月24日21:34:25 GMT”; //
  Server = nginx; //“access-control-allow-credentials”= true; //}   } // [TemporaryURL]:   /private/var/mobile/Containers/Data/Application/25612024-9A05-4ED5-AF3B-A98E22DEAD7A/tmp/CFNetworkDownload_fD9sXf.tmp   // [DestinationURL]:   /var/mobile/Containers/Data/Application/25612024-9A05-4ED5-AF3B-A98E22DEAD7A/Documents/image.png   // [ResumeData]:0字节// [结果]:成功:8090字节//   [时间轴]:时间线:{“请求开始时间”:496445664.792,“初始   响应时间“:496445665.651,”请求完成时间“:   496445665.655,“序列化完成时间”:496445665.655,“延迟”:0.860秒,“请求持续时间”:0.863秒,“序列化   持续时间“:0.000秒,”总持续时间“:0.864秒} //   可选(,{100,100})你必须使用a   目标关闭,如果您需要将文件下载到磁盘。该   临时文件只能在委托回调中访问   在Alamofire内部处理。如果你没有指定   iOS上的目标关闭,temporaryURL将始终指向   临时文件以前存储过的位置,但已经清理过。

     

摘要

     

总而言之,如果您不需要将数据下载到磁盘,那么   你想要选项1.如果你想将文件保存在磁盘上,那么你   想要选择2。

     

干杯。