圖片視頻上傳下載

# import   // 必须导入
 
// 照片原图路径
#define KOriginalPhotoImagePath  
[[NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) objectAtIndex: 0 ] stringByAppendingPathComponent: @OriginalPhotoImages ]
 
// 视频URL路径
#define KVideoUrlPath  
[[NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) objectAtIndex: 0 ] stringByAppendingPathComponent: @VideoURL ]
 
// caches路径
#define KCachesPath  
[NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) objectAtIndex: 0 ]
 
// MainViewController
@interface MTHMainViewController ()
 
@property (nonatomic,strong) MTHNextViewController *nextVC;
@property (nonatomic,strong) NSMutableArray        *groupArrays;
@property (nonatomic,strong) UIImageView           *litimgView;
 
@end
 
@implementation MTHMainViewController
 
- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
     self = [ super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
     if (self) {
         // Custom initialization
     }
     return self;
}
 
- ( void )viewDidLoad
{
     [ super viewDidLoad];
     // Do any additional setup after loading the view.
     self.navigationItem.title = @Demo ;
     self.view.backgroundColor = [UIColor clearColor];
     
     // 初始化
     self.groupArrays = [NSMutableArray array];
     
     // 测试BarItem
     self.navigationItem.rightBarButtonItem = [[UIBarButtonItem alloc] initWithTitle:@测试 style:UIBarButtonItemStylePlain target:self action: @selector (testRun)];
     
     // 测试手势
     UIPanGestureRecognizer *panRecognizer = [[UIPanGestureRecognizer alloc] initWithTarget:self action: @selector (didClickPanGestureRecognizer:)];
     [self.navigationController.view addGestureRecognizer:panRecognizer];
     
     // 图片或者视频的缩略图显示
     self.litimgView = [[UIImageView alloc] initWithFrame:CGRectMake( 100 , 200 , 120 , 120 )];
     [self.view addSubview:_litimgView];
}
 
 
- ( void )testRun
{
     __weak MTHMainViewController *weakSelf = self;
     dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0 ), ^{
         ALAssetsLibraryGroupsEnumerationResultsBlock listGroupBlock = ^(ALAssetsGroup *group, BOOL *stop) {
             if (group != nil) {
                 [weakSelf.groupArrays addObject:group];
             } else {
                 [weakSelf.groupArrays enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
                     [obj enumerateAssetsUsingBlock:^(ALAsset *result, NSUInteger index, BOOL *stop) {
                         if ([result thumbnail] != nil) {
                             // 照片
                             if ([[result valueForProperty:ALAssetPropertyType] isEqualToString:ALAssetTypePhoto]){
                                 
                                 NSDate *date= [result valueForProperty:ALAssetPropertyDate];
                                 UIImage *image = [UIImage imageWithCGImage:[result thumbnail]];
                                 NSString *fileName = [[result defaultRepresentation] filename];
                                 NSURL *url = [[result defaultRepresentation] url];
                                 int64_t fileSize = [[result defaultRepresentation] size];
                                 
                                 NSLog( @date = %@,date);
                                 NSLog( @fileName = %@,fileName);
                                 NSLog( @url = %@,url);
                                 NSLog( @fileSize = %lld,fileSize);
                                 
                                 // UI的更新记得放在主线程,要不然等子线程排队过来都不知道什么年代了,会很慢的
                                 dispatch_async(dispatch_get_main_queue(), ^{
                                     self.litimgView.image = image;
                                 });
                             }
                             // 视频
                             else if ([[result valueForProperty:ALAssetPropertyType] isEqualToString:ALAssetTypeVideo] ){
                             
                                 // 和图片方法类似
                             }
                         }
                     }];
                 }];
 
             }
         };
         
         ALAssetsLibraryAccessFailureBlock failureBlock = ^(NSError *error)
         {
             
             NSString *errorMessage = nil;
             
             switch ([error code]) {
                 case ALAssetsLibraryAccessUserDeniedError:
                 case ALAssetsLibraryAccessGloballyDeniedError:
                     errorMessage = @用户拒绝访问相册,请在<隐私>中开启;
                     break ;
                     
                 default :
                     errorMessage = @Reason unknown.;
                     break ;
             }
             
             dispatch_async(dispatch_get_main_queue(), ^{
                 UIAlertView *alertView = [[UIAlertView alloc]initWithTitle:@错误,无法访问!
                                                                    message:errorMessage
                                                                   delegate:self
                                                          cancelButtonTitle:@确定
                                                          otherButtonTitles:nil, nil];
                 [alertView show];
             });
         };
         
         
         ALAssetsLibrary *assetsLibrary = [[ALAssetsLibrary alloc]  init];
         [assetsLibrary enumerateGroupsWithTypes:ALAssetsGroupAll
                                      usingBlock:listGroupBlock failureBlock:failureBlock];
     });
}
</assetslibrary>


// 将原始图片的URL转化为NSData数据,写入沙盒
- ( void )imageWithUrl:(NSURL *)url withFileName:(NSString *)fileName
{
     // 进这个方法的时候也应该加判断,如果已经转化了的就不要调用这个方法了
     // 如何判断已经转化了,通过是否存在文件路径
     ALAssetsLibrary *assetLibrary = [[ALAssetsLibrary alloc] init];
     // 创建存放原始图的文件夹--->OriginalPhotoImages
     NSFileManager * fileManager = [NSFileManager defaultManager];
     if (![fileManager fileExistsAtPath:KOriginalPhotoImagePath]) {
         [fileManager createDirectoryAtPath:KOriginalPhotoImagePath withIntermediateDirectories:YES attributes:nil error:nil];
     }
     dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0 ), ^{
         if (url) {
             // 主要方法
             [assetLibrary assetForURL:url resultBlock:^(ALAsset *asset) {
                 ALAssetRepresentation *rep = [asset defaultRepresentation];
                 Byte *buffer = (Byte*)malloc((unsigned long )rep.size);
                 NSUInteger buffered = [rep getBytes:buffer fromOffset: 0.0 length:((unsigned long )rep.size) error:nil];
                 NSData *data = [NSData dataWithBytesNoCopy:buffer length:buffered freeWhenDone:YES];
                 NSString * imagePath = [KOriginalPhotoImagePath stringByAppendingPathComponent:fileName];
                 [data writeToFile:imagePath atomically:YES];
             } failureBlock:nil];
         }
     });
}
 
// 将原始视频的URL转化为NSData数据,写入沙盒
- ( void )videoWithUrl:(NSURL *)url withFileName:(NSString *)fileName
{
     // 解析一下,为什么视频不像图片一样一次性开辟本身大小的内存写入?
     // 想想,如果1个视频有1G多,难道直接开辟1G多的空间大小来写?
     ALAssetsLibrary *assetLibrary = [[ALAssetsLibrary alloc] init];
     dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0 ), ^{
         if (url) {
             [assetLibrary assetForURL:url resultBlock:^(ALAsset *asset) {
                 ALAssetRepresentation *rep = [asset defaultRepresentation];
                 NSString * videoPath = [KCachesPath stringByAppendingPathComponent:fileName];
                 char const *cvideoPath = [videoPath UTF8String];
                 FILE *file = fopen(cvideoPath, a+);
                 if (file) {
                     const int bufferSize = 1024 * 1024 ;
                     // 初始化一个1M的buffer
                     Byte *buffer = (Byte*)malloc(bufferSize);
                     NSUInteger read = 0 , offset = 0 , written = 0 ;
                     NSError* err = nil;
                     if (rep.size != 0 )
                     {
                         do {
                             read = [rep getBytes:buffer fromOffset:offset length:bufferSize error:&err];
                             written = fwrite(buffer, sizeof( char ), read, file);
                             offset += read;
                         } while (read != 0 && !err); //没到结尾,没出错,ok继续
                     }
                     // 释放缓冲区,关闭文件
                     free(buffer);
                     buffer = NULL;
                     fclose(file);
                     file = NULL;
                 }
             } failureBlock:nil];
         }
     });
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值