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

使用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上传图片和视频(支持多张图片上传))