因此,由于人们对此有麻烦,因此开始了其他一些线程。像这个:Obtain NSURL from UIImagePickerController和这个:
Firebase storage upload works in Simulator but not on iPhone
我正在尝试遵循本教程:
https://firebase.google.com/docs/storage/ios/upload-files#upload_from_a_local_file
我的视频可以上传,但不能上传图像。
我的视频代码很简单:
if mediaType.isEqualToString(kUTTypeMovie as String) {
let videoURL = info[UIImagePickerControllerMediaURL] as? NSURL
fileToUploadURL = videoURL!
}
但是我的图片代码不起作用。这就是我最终得到的:
let imageUrl = info["UIImagePickerControllerReferenceURL"] as? NSURL
let assets = PHAsset.fetchAssetsWithALAssetURLs([imageUrl!], options: nil)
let asset = assets.firstObject
asset?.requestContentEditingInputWithOptions(nil, completionHandler: { (contentEditingInput, info) in
let imageFile = contentEditingInput?.fullSizeImageURL
// now call putFile with imageFile instead of imageUrl
self.fileToUploadURL = imageFile
})
似乎无论我做什么我都会出错。
这是我目前的错误
2016-06-25 12:45:23.695 Chain[4187:1957121] Body file is unreachable: /var/mobile/Media/DCIM/100APPLE/IMG_0027.JPG
Error Domain=NSCocoaErrorDomain Code=257 "The file “IMG_0027.JPG” couldn’t be opened because you don’t have permission to view it."
控制台日志
2016-06-25 12:47:59.108链[4187:1957121]正文文件无法访问:/var/mobile/Media/DCIM/100APPLE/IMG_0027.JPG
“Error Domain = NSCocoaErrorDomain代码= 257“由于您无权查看文件,因此无法打开文件“IMG_0027.JPG”。” UserInfo = {NSURL = file:///var/mobile/Media/DCIM/100APPLE/IMG_0027.JPG,NSFilePath = / var / mobile / Media / DCIM / 100APPLE / IMG_0027.JPG,NSUnderlyingError = 0x18b7ad40 {Error Domain = NSPOSIXErrorDomain Code = 1“不允许操作”}}
2016-06-25 12:48:02.969 Chain [4187:1957659]插件com.swiftkey.SwiftKeyApp.Keyboard无效
可选([[“public.image”,“public.movie”])
信息:[“UIImagePickerControllerOriginalImage”:大小{1836,1454}方向0比例1.000000,“UIImagePickerControllerReferenceURL”:asset-library://asset/asset.JPG?id = 5FE3480C-0A3E-42B2-B83B-93D0F321A3B2&ext = JPG,“UIImagePickerControllerMediaType “:public.image,” UIImagePickerControllerCropRect“:NSRect:{{0,0},{1836,1452}},” UIImagePickerControllerEditedImage“:大小{638,504}方向0比例1.000000]
fileToUploadURL:file:///var/mobile/Media/DCIM/100APPLE/IMG_0027.JPG
可选([[“public.image”,“public.movie”])
2016-06-25 13:01:58.845 Chain [4187:1958957]插件com.swiftkey.SwiftKeyApp.Keyboard无效
信息:[“UIImagePickerControllerOriginalImage”:大小{1836,1454}方向0比例1.000000,“UIImagePickerControllerReferenceURL”:asset-library://asset/asset.JPG?id = CFF5692E-2B93-407D-A9E4-48AC1BEDCAF2&ext = JPG,“UIImagePickerControllerMediaType “:public.image,” UIImagePickerControllerCropRect“:NSRect:{{0,0},{1836,1452}},” UIImagePickerControllerEditedImage“:大小{638,504}方向0比例1.000000]
fileToUploadURL:无
2016-06-25 13:04:05.136 Chain [4187:1957121] _BSMachError:(os / kern)无效功能(20)
2016-06-25 13:04:05.138 Chain [4187:1959394] _BSMachError:(os / kern)无效名称(15)
2016-06-25 13:04:05.146 Chain [4187:1959394]插件com.swiftkey.SwiftKeyApp.Keyboard无效
2016-06-25 13:04:05.220链[4187:1957188] CFNetwork SSLHandshake失败(-9806)
2016-06-25 13:04:05.661链[4187:1957121]正文文件无法访问:/var/mobile/Media/DCIM/100APPLE/IMG_0015.JPG
“Error Domain = NSCocoaErrorDomain代码= 257“由于您无权查看文件,因此无法打开文件“IMG_0015.JPG”。” UserInfo = {NSURL = file:///var/mobile/Media/DCIM/100APPLE/IMG_0015.JPG,NSFilePath = / var / mobile / Media / DCIM / 100APPLE / IMG_0015.JPG,NSUnderlyingError = 0x18bd4330 {Error Domain = NSPOSIXErrorDomain Code = 1“不允许操作”}}
编辑:这是我的didFinishPickingMedia:
func imagePickerController(picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : AnyObject]) {
let mediaType = info[UIImagePickerControllerMediaType] as! NSString
print ("info: \(info)")
if mediaType.isEqualToString(kUTTypeImage as String) {
var newImage: UIImage
if let possibleImage = info["UIImagePickerControllerEditedImage"] as? UIImage {
newImage = possibleImage
}
else if let possibleImage = info["UIImagePickerControllerOriginalImage"] as? UIImage {
newImage = possibleImage
}
else {
return
}
/// CAN NOT GET NSURL working, NEED TO USE NSDATA
if let jpegData:NSData = UIImageJPEGRepresentation(newImage, 80) {
currentMediaTypeToUpload = "img"
fileToUploadDATA = jpegData
}
}
else if mediaType.isEqualToString(kUTTypeMovie as String) {
let videoURL = info[UIImagePickerControllerMediaURL] as? NSURL
fileToUploadURL = videoURL!
currentMediaTypeToUpload = "vid"
}
最佳答案
解决方案在这里:how do I get NSURL for an image froom UIImagePickerController? for upload to Firebase
应用于我们的问题:
if let referenceUrl = info[UIImagePickerControllerReferenceURL] {
////
let assetURL = NSURL(string: String(referenceUrl))
let assets = PHAsset.fetchAssetsWithALAssetURLs([assetURL!], options: nil)
let asset: PHAsset = assets.firstObject as! PHAsset
let manager = PHImageManager.defaultManager()
let requestSize = PHImageManagerMaximumSize
manager.requestImageForAsset(asset, targetSize: requestSize, contentMode: .AspectFit, options: nil, resultHandler: {(result, info)->Void in
// Result is a UIImage
// Either upload the UIImage directly or write it to a file
let imageData = UIImageJPEGRepresentation(result!, 0.8)
let imagePath = FIRAuth.auth()!.currentUser!.uid + "/\(Int(NSDate.timeIntervalSinceReferenceDate() * 1000)).jpg"
print ("filePath: ", imagePath)
let metadata = FIRStorageMetadata()
metadata.contentType = "image/jpeg"
self.storageRef.child(imagePath)
.putData(imageData!, metadata: metadata) { (metadata, error) in
if let error = error {
print("Error uploading: \(error.description)")
return
}
self.sendMessage([Constants.MessageFields.imageUrl: self.storageRef.child((metadata?.path)!).description])
print("Succeded")
}
})
}
使用此解决方案,我可以将文件上传到Firebase。