1
- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingImage:(UIImage *)image editingInfo:(NSDictionary *)editInfo {
userURL = [editInfo objectForKey:UIImagePickerControllerMediaURL];
userImage = image;
userImageView.image=userImage;
[self dismissViewControllerAnimated:YES completion:nil];}

然后我获取 NSURL userURL,并将其放在 UIActivityViewController 中以用于上传图像。但是,这永远不会起作用,并且在尝试上传时总是失败(null)。但是,当我使用 xcode 项目中包含的预设图像和以下代码时,它始终可以正常工作并正确上传:

NSURL *url = [[NSBundle mainBundle] URLForResource:@"kitten.jpg" withExtension:nil];

如果有帮助,我正在使用https://github.com/goosoftware/GSDropboxActivity

当我使用 UIImagePickerControllerReferenceURL 而不是 UIImagePickerControllerMediaURL 时,我收到以下错误:[警告] DropboxSDK:文件不存在 (/asset.JPG) 无法上传 assets-library://asset/asset.JPG?id=EECAF4D0-A5ED- 40E7-8E6F-3A586C0AB06E&ext=JPG

4

1 回答 1

0

理论上,UIImagePickerControllerMediaURL只为电影填充,而不是图像。如果您使用,UIImagePickerControllerReferenceURL那么您获得的 URL 不是文件系统的 URL,而是资产库。要从中获取文件,您需要使用资产库。使用类似以下内容:

typedef void (^ALAssetsLibraryAssetForURLResultBlock)(ALAsset *asset);
typedef void (^ALAssetsLibraryAccessFailureBlock)(NSError *error);    

ALAssetsLibraryAssetForURLResultBlock resultblock = ^(ALAsset *myasset){

    ALAssetRepresentation *rep = [myasset defaultRepresentation];
    CGImageRef iref = [rep fullResolutionImage];

    if (iref){

        UIImage *myImage = [UIImage imageWithCGImage:iref scale:[rep scale] orientation:(UIImageOrientation)[rep orientation]];

         // Do whatever you now want with your UIImage
     }      
};      

ALAssetsLibraryAccessFailureBlock failureblock  = ^(NSError *myerror){                   
    //failed to get image.
};                          

ALAssetsLibrary* assetslibrary = [[ALAssetsLibrary alloc] init];
[assetslibrary assetForURL:[filePath objectAtIndex:0] resultBlock:resultblock failureBlock:failureblock];

这会处理将处理您的请求的块,但您仍然需要实际从资产库中请求资源。为此,试试这个:

ALAssetsLibrary* assetslibrary = [[[ALAssetsLibrary alloc] init] autorelease];
NSURL myAssetUrl = [NSURL URLWithString:[editInfo objectForKey:UIImagePickerControllerMediaURL]];
[assetslibrary assetForURL:myAssetUrl resultBlock:resultblock failureBlock:failureblock];

从理论上讲,您应该得到您所追求的 :) 此代码由Ramshad提供,可以在此处找到对其的进一步讨论

希望这将帮助您完成您所追求的。抱歉,如果有点晚了:(

编辑

请注意,如果您不使用 ARC,则需要在此示例中整理内存,因为我根本没有包含任何内存管理。

于 2012-12-29T19:57:32.937 回答