我正在尝试使用带有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新版本是否存在某些问题,还是我忘了某些地方?
谢谢!
答案 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。
干杯。