美文网首页AFNetworking
AFNetworking上传图片和视频(支持多张图片上传)

AFNetworking上传图片和视频(支持多张图片上传)

作者: 木马不在转 | 来源:发表于2016-08-23 19:48 被阅读1433次

    1使用AFNetworking上传图片和视频,支持多张图片上传。以下是AFNetworking用于上传文件的关键函数。

    /**

    @paramdata图片或视频二进制数据

    @paramname 对应服务器的字段名

    @paramfileName 文件名,后缀要跟文件类型一致,不能为空

    @parammimeType 文件类型 举例image/pngvideo/quicktime

    */

    - (void)appendPartWithFileData:(NSData*)data

    name:(NSString*)name

    fileName:(NSString*)fileName

    mimeType:(NSString*)mimeType;

    主要实现代码如下:

    - (void)uploadFileWithMediaData:(NSMutableArray *)mediaDatas

    url:(NSString *)url

    params:(id)params

    {

    AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];

    manager.responseSerializer.acceptableContentTypes = [NSSet setWithObjects:@"text/html",

    @"text/plain",

    @"application/json",nil];

    AFHTTPRequestOperation *operation = [manager POST:url

    parameters:nil

    constructingBodyWithBlock:^(id formData) {

    if (mediaDatas.count > 0) {

    NSObject *firstObj = [mediaDatas objectAtIndexSafe:0];

    if ([firstObj isKindOfClass:[UIImage class]]) {    // 图片

    for(NSInteger i=0; i

    UIImage *eachImg = [mediaDatas objectAtIndexSafe:i];

    //NSData *eachImgData = UIImagePNGRepresentation(eachImg);

    NSData *eachImgData = UIImageJPEGRepresentation(eachImg, 0.5);

    [formData appendPartWithFileData:eachImgData name:@"file" fileName:[NSString stringWithFormat:@"img%ld.png", i+1] mimeType:@"image/png"];

    }

    }else if([firstObj isKindOfClass:[ALAsset class]]){

    // 视频

    ALAsset *asset = [mediaDatas objectAtIndexSafe:0];

    NSLog(@"asset=%@, representation=%@, url=%@", asset, [asset defaultRepresentation], [asset defaultRepresentation].url);

    if (asset != nil) {

    NSArray *documentPaths= NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);

    NSString *docuPath = [documentPaths objectAtIndex:0];

    NSString *videoPath= [docuPath stringByAppendingPathComponent:[NSString stringWithFormat:@"%d.mov", 0]];    // 这里直接强制写一个即可,之前计划是用i++来区分不明视频

    NSURL *url = [NSURL fileURLWithPath:videoPath];

    NSError *theErro = nil;

    BOOL exportResult = [asset exportDataToURL:url error:&theErro];

    NSLog(@"exportResult=%@", exportResult?@"YES":@"NO");

    NSData *videoData = [NSData dataWithContentsOfURL:url];

    [formData appendPartWithFileData:videoData name:@"file" fileName:@"video1.mov" mimeType:@"video/quicktime"];

    }

    }

    }

    } success:^(AFHTTPRequestOperation *operation, id responseObject) {

    //成功后回调

    } failure:^(AFHTTPRequestOperation *operation, NSError *error) {

    //失败后回调

    }];

    [operation setUploadProgressBlock:^(NSUInteger bytesWritten, long long totalBytesWritten, long long totalBytesExpectedToWrite) {

    //进度

    self.progressBlock(totalBytesWritten*1.0/totalBytesExpectedToWrite);

    }];

    }

    2通过CTAssetsPickerController来选择手机相册中的视频文件的。然后通过生成一个视频文件名及地址,

    并通过一个写方法, 写到该路径下, 写文件如下。

    #import "ALAsset+mExport.h"

    #define BufferSize 10000

    @implementation ALAsset (mExport)

    - (BOOL) exportDataToURL: (NSURL*) fileURL error: (NSError**) error

    {

    [[NSFileManager defaultManager] createFileAtPath:[fileURL path] contents:nil attributes:nil];

    NSFileHandle *handle = [NSFileHandle fileHandleForWritingToURL:fileURL error:error];

    if (!handle) {

    return NO;

    }

    ALAssetRepresentation *rep = [self defaultRepresentation];

    uint8_t *buffer = calloc(BufferSize, sizeof(*buffer));

    NSUInteger offset = 0, bytesRead = 0;

    do {

    @try {

    bytesRead = [rep getBytes:buffer fromOffset:offset length:BufferSize error:error];

    [handle writeData:[NSData dataWithBytesNoCopy:buffer length:bytesRead freeWhenDone:NO]];

    offset += bytesRead;

    } @catch (NSException *exception) {

    free(buffer);

    return NO;

    }

    } while (bytesRead > 0);

    free(buffer);

    return YES;

    }

    @end

    相关文章

      网友评论

      本文标题:AFNetworking上传图片和视频(支持多张图片上传)

      本文链接:https://www.haomeiwen.com/subject/szjnsttx.html