使用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