Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/276.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Swift 阿拉莫菲尔下载问题_Swift_Alamofire - Fatal编程技术网

Swift 阿拉莫菲尔下载问题

Swift 阿拉莫菲尔下载问题,swift,alamofire,Swift,Alamofire,我正在尝试使用Alamofire 4.0.0、Xcode 8.0和Swift 3.0下载我的代码 这是我的要求: func download(_ path: String, _ completionHandler: @escaping (Any?) -> ()) { let stringURL = "https://slove.tulleb.com/uploads/6/6/0/2/66027561/2791411.jpg-1447979839.png"

我正在尝试使用Alamofire 4.0.0、Xcode 8.0和Swift 3.0下载我的代码

这是我的要求:

    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.ResponseSerializationFaileureReason.inputFileReadFailed(file:///private/var/mobile/Containers/Data/Application/50400F41-47FD-4276-8903-F48D942D064A/tmp/CFNetworkDownload_D1Aqkh.tmp))

我不知道如何解决这个问题。。。阿拉莫菲尔的新版本是有问题还是我忘了什么

谢谢

嗨@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")
    }
}
//产出:

//[请求]://[响应]: {URL: }{状态代码:200,标题{//“访问控制允许来源”= “*”;/“内容长度”=8090;/“内容类型”= “image/png”;///Date=“2016年9月24日星期六21:34:25 GMT”//
服务器=nginx;//“访问控制允许凭据”=true;//} }//[临时URL]: /专用/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字节//[Result]:成功:8090字节// [时间线]:时间线:{“请求开始时间”:496445664.792,“初始 响应时间:496445665.651,“请求完成时间”: 496445665.655,“序列化完成时间”:496445665.655,“延迟”:0.860秒,“请求持续时间”:0.863秒,“序列化” 持续时间:0.000秒,“总持续时间”:0.864秒}// 可选(,{100,100})必须使用 如果需要将文件下载到磁盘,请关闭目标。这个 只能在委托回调内部访问临时文件 在阿拉莫菲尔内部处理。如果不指定 在iOS上,临时URL将始终指向 临时文件以前存储但已被清理的位置

总结

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


干杯。我遇到了同样的问题。谢谢你的回答!