2016-09-14 99 views
14

我试图在我的代码中使用Alamofire 4.0.0与Xcode 8.0和Swift 3.0一起下载this pictureAlamofire下载问题

这里是我的要求:

func download(_ path: String, _ completionHandler: @escaping (Any?) ->()) { 
     let stringURL = "https://slove.tulleb.com/uploads/6/6/0/2/66027561/2791411.jpg-1447979839.png" 

     print("Requesting \(stringURL)...") 

     _ = Alamofire.download(stringURL) 
      .responseData { response in 
       print(response) 

       if let data = response.result.value { 
        completionHandler(UIImage(data: data)) 
       } else { 
        completionHandler(nil) 
       } 
     } 
    } 

我从服务器得到如下回答:

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

我对如何解决这个问题没有任何想法... Alamofire新版本是否有一些问题,或者是我忘记了什么地方?

谢谢!

回答

18

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 // [回应]: {网址:https://httpbin.org/image/png } {状态代码:200,头文件{//“Access-Control-Allow-Origin”= “*”; //“Content-Length”= 8090; //“Content-Type”= “image/png”; // Date =“Sat,24 Sep 2016 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]: /无功/mobile/Containers/Data/Application/25612024-9A05-4ED5-AF3B-A98E22DEAD7A/Documents/image.png // [ResumeData]:0字节// [结果]:SUCCESS:8090字节// [时间轴]:时间轴:{“请求开始时间”:496445664.792,“初始 响应时间”:496445665.651,“请求完成时间”: 496445665.655,“序列化完成时间”:496445665.655,“延迟时间”:0.860秒,“请求持续时间”:0.863秒,“序列号 持续时间”:0.000秒,“总持续时间”:0.864秒} // 可选(,{100,100})您必须使用 目标关闭如果您需要将文件下载到磁盘。 临时文件只能在Alamofire内部处理的代理回调中进行访问。 如果您未在iOS上指定目标关闭 ,temporaryURL将始终指向 ,其中临时文件先前已存储,但已被清除。

摘要

在总结

所以,如果你不需要 你想选1.将数据下载到磁盘,然后如果你想保存在磁盘上的文件,然后你想 选项2

干杯。

+0

非常明确的答案,非常感谢。 – Adagio

+0

我遇到了同样的问题。感谢你的回答! – user30646