2016-09-14 140 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