Swift 阿拉莫菲尔下载问题
我正在尝试使用Alamofire 4.0.0、Xcode 8.0和Swift 3.0下载我的代码 这是我的要求: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"
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
干杯。我遇到了同样的问题。谢谢你的回答!