有很多答案建议 UIImageJPEGRepresentation 或 UIImagePNGRepresentation。但是这些解决方案将转换原始文件,而这个问题实际上是关于按原样保存文件。
看起来直接从资产库上传文件是不可能的。但可以使用 PHImageManager 访问它以获取实际的图像数据。就是这样:
Swift 3(Xcode 8,仅适用于 iOS 8.0 及更高版本)
1) 导入照片框架
import Photos
2) 在 imagePickerController(_:didFinishPickingMediaWithInfo:) 中获取资源 URL
3) 使用 fetchAssets(withALAssetURLs:options:) 获取资产
4) 使用requestImageData(for:options:resultHandler:)获取实际的图像数据。在此方法的结果处理程序中,您将拥有文件的数据和 URL(可以在模拟器上访问 URL,但不幸的是在设备上无法访问 - 在我的测试中 startAccessingSecurityScopedResource() 始终返回 false)。但是,此 URL 仍可用于查找文件名。
示例代码:
func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) {
dismiss(animated: true, completion: nil)
if let assetURL = info[UIImagePickerControllerReferenceURL] as? URL,
let asset = PHAsset.fetchAssets(withALAssetURLs: [assetURL], options: nil).firstObject,
let documentsPath = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true).first,
let targetURL = Foundation.URL(string: "file://\(documentsPath)") {
PHImageManager.default().requestImageData(for: asset, options: nil, resultHandler: { (data, UTI, _, info) in
if let imageURL = info?["PHImageFileURLKey"] as? URL,
imageData = data {
do {
try data.write(to: targetURL.appendingPathComponent(imageURL.lastPathComponent), options: .atomic)
self.proceedWithUploadFromPath(targetPath: targetURL.appendingPathComponent(imageURL.lastPathComponent))
} catch { print(error) }
}
}
})
}
}
这将为您提供包含正确名称的文件原样,您甚至可以在准备上传的多部分正文时获取其 UTI 以确定正确的 mimetype(除了通过文件扩展名确定它)。