123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268 |
- //
- // nasUploadManager.m
- // 双子星云手机
- //
- // Created by xd h on 2024/8/7.
- //
- #import "nasUploadManager.h"
- #import "AFNetworkReachabilityManager.h"
- #import "AFHTTPSessionManager.h"
- #import "frpUploadModel.h"
- @interface nasUploadManager ()
- @property(nonatomic,strong)AFHTTPSessionManager *uploadManager;
- @end
- @implementation nasUploadManager
- + (instancetype)shareInstance {
- static nasUploadManager *_instance;
- static dispatch_once_t onceToken;
- dispatch_once(&onceToken, ^{
- _instance = [[self alloc] init];
- });
- return _instance;
- }
- - (id)init
- {
- self = [super init];
- if (self) {
- [self initManager];
- }
- return self;
- }
- - (void)initManager
- {
- _uploadManager = [[AFHTTPSessionManager alloc] init];
- _uploadManager.requestSerializer = [AFJSONRequestSerializer serializer];
- _uploadManager.responseSerializer = [AFJSONResponseSerializer serializer];
-
- [_uploadManager.requestSerializer setValue:@"application/json" forHTTPHeaderField:@"Content-Type"];
- _uploadManager.responseSerializer.acceptableContentTypes = [NSSet setWithObjects:@"application/json",@"text/json", @"text/javascript",@"text/html",@"text/plain",nil];
- _uploadManager.requestSerializer.timeoutInterval = 180;
-
- }
- - (void)nasUploadFileToFileServiceWithParams:(NSMutableDictionary *)params model:(uploadFileDataModel*)dataModel data:(NSData *)data success:(netWork_Success)success faild:(netWork_Faild)faildStr {
-
- NSString *urlString = ksharedAppDelegate.NASFileByBoxService;
- urlString = [[NSString alloc] initWithFormat:@"%@uploadFile",urlString];
-
- NSInteger position = 0;
- if([[params allKeys] containsObject:@"position"]){
- NSNumber *positionNumber = params[@"position"];
- position = positionNumber.longValue;
- }
-
- HLog(@"上传地址:%@---%@---position:%ld--",urlString,params,position);
-
- [_uploadManager POST:urlString parameters:params constructingBodyWithBlock:^(id<AFMultipartFormData> _Nonnull formData) {
-
- NSString *mimeType =@"application/octet-stream";
- if ([[params allKeys] containsObject:@"imageType"]) {
- mimeType = @"image/jpeg";
- }
- else if ([[params allKeys] containsObject:@"videoType"]) {
- mimeType = @"video/mp4";
- }
-
- [formData appendPartWithFileData:data name:@"file" fileName:params[@"filename"] mimeType:mimeType];
-
- } progress:^(NSProgress * _Nonnull uploadProgress) {
- HLog(@"上传 Progress:--%@---%lld",uploadProgress,uploadProgress.completedUnitCount)
- dataModel.didUploadBytes = position + (uploadProgress.completedUnitCount);
- [[NSNotificationCenter defaultCenter] postNotificationName:uploadFileRefreshNotification object:dataModel];
-
- } success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) {
-
- success(responseObject);
-
- } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error, id _Nonnull responseObject) {
-
- faildStr(error);
- }];
- }
- - (void)beginUploadDataBy:(uploadFileDataModel*)dataModel success:(netWork_Success)success faild:(netWork_Faild)faildStr
- {
- NSMutableDictionary *paraDict = [NSMutableDictionary new];
- NSString* taskUid = [iTools getTaskUidStr];
- [paraDict setObject:taskUid forKey:@"taskId"];
- [paraDict setObject:@0 forKey:@"position"];
- [paraDict setObject:@1 forKey:@"isLast"];
- if(dataModel.savePath){
- [paraDict setObject:dataModel.savePath forKey:@"savePath"];
- }
- else{
- HLog(@"获取保存路径失败")
- return;
- }
-
- if(dataModel.filename){
- [paraDict setObject:dataModel.filename forKey:@"filename"];
- }
- else{
- HLog(@"获取用户名失败")
- return;
- }
-
- KWeakSelf
- if(dataModel.curUploadFileType == uploadFileTypeImage){
- [paraDict setObject:@1 forKey:@"imageType"];
- NSData *curData = dataModel.imageData;
-
- [self nasUploadFileToFileServiceWithParams:paraDict model:dataModel data:curData success:^(id _Nonnull responseObject) {
- HLog(@"%@上传完成",dataModel.filename)
- success(responseObject);
- } faild:^(NSError * _Nonnull error) {
- HLog(@"%@上传失败",dataModel.filename)
- faildStr(error);
- }];
- }
- else{
- [paraDict setObject:@1 forKey:@"videoType"];
-
- //断点续传处理 先传1字节数据看服务器是否有数据
- //NSData *videoData = [self cutVideoFileFunAtIndex:0 withMaxLenght:1 withModel:dataModel];
- //[paraDict setObject:@0 forKey:@"isLast"];
-
- NSData *videoData = [self cutVideoFileFunAtIndex:0 withMaxLenght:MaxNasUploadPieceSzie withModel:dataModel];
-
- // NSData *videoData = [self cutVideoFileFunAtIndex:0 withMaxLenght:MaxNasUploadPieceSzie withModel:dataModel];
-
-
- [self nasUploadFileToFileServiceWithParams:paraDict model:dataModel data:videoData success:^(id _Nonnull responseObject) {
- HLog(@"%@上传完成",dataModel.filename)
- success(responseObject);
-
- // frpUploadModel *model = [[frpUploadModel alloc] initWithDictionary:responseObject error:nil];
- // if(model && model.msg){
- // NSInteger curPosition = model.position > 0 ? model.position : 1;
- // [weakSelf beginUploadVideoDataFunBy:dataModel with:curPosition withPara:paraDict success:^(id _Nonnull responseObject) {
- // success(responseObject);
- // } faild:^(NSError * _Nonnull error) {
- // faildStr(error);
- // }];
- // }
- // else{
- // NSError *err = [NSError new];
- // faildStr(err);
- // }
-
- } faild:^(NSError * _Nonnull error) {
- HLog(@"%@上传失败",dataModel.filename)
- faildStr(error);
- }];
- }
-
- }
- - (void)beginUploadVideoDataFunBy:(uploadFileDataModel*)dataModel with:(NSInteger)position withPara:(NSMutableDictionary*)paraDict success:(netWork_Success)success faild:(netWork_Faild)faildStr
- {
- BOOL isLastPicece = NO;
- if((dataModel.totalBytes - position) <= MaxNasUploadPieceSzie){
- [paraDict setObject:@1 forKey:@"isLast"];
- isLastPicece = YES;
- }
-
- [paraDict setObject:[NSNumber numberWithLong:position] forKey:@"position"];
-
- //视频数据切片
- NSData *videoData = [self cutVideoFileFunAtIndex:position withMaxLenght:MaxNasUploadPieceSzie withModel:dataModel];
-
- KWeakSelf
- [self nasUploadFileToFileServiceWithParams:paraDict model:dataModel data:videoData success:^(id _Nonnull responseObject) {
- HLog(@"%@上传完成",dataModel.filename)
-
- frpUploadModel *model = [[frpUploadModel alloc] initWithDictionary:responseObject error:nil];
- if(model && model.msg){
- if (isLastPicece) {
- success(responseObject);
- }
- else{
- [weakSelf beginUploadVideoDataFunBy:dataModel with:(position +MaxNasUploadPieceSzie) withPara:paraDict success:^(id _Nonnull responseObject) {
-
- } faild:^(NSError * _Nonnull error) {
- NSError *err = [NSError new];
- faildStr(err);
- }];
- }
- }
- else{
- NSError *err = [NSError new];
- faildStr(err);
- }
-
- } faild:^(NSError * _Nonnull error) {
- HLog(@"%@上传失败---%@",dataModel.filename,error)
- faildStr(error);
- }];
- }
- #pragma mark 分段读视频文件
- -(NSData*)cutVideoFileFunAtIndex:(NSUInteger)dataIndex withMaxLenght:(NSInteger)maxLengt withModel:(uploadFileDataModel*)dataModel{
- NSString *filePath = [cachesFileManager getFilePathWithName:dataModel.filename type:uploadFileTypeVideo]; // 文件路径
-
- NSFileManager *manager0 = [NSFileManager defaultManager];
- if(![manager0 fileExistsAtPath:filePath]) {
-
- return [NSData new];
- }
-
- NSFileHandle *fileHandle = [NSFileHandle fileHandleForReadingAtPath:filePath]; // 创建文件句柄
-
- // 设置分段读取的大小,这里以每次读取1KB为例
- const NSUInteger chunkSize = maxLengt;//cutVideoPieceSzie;//5 * 1024 *1024;
- NSMutableData *data = [NSMutableData data];
-
- if (fileHandle) {
-
- long long endOfFile = [fileHandle seekToEndOfFile];
-
- if(dataModel.totalBytes == 0
- || dataModel.totalBytes < endOfFile){//异常处理
- dataModel.totalBytes = endOfFile;
- }
-
- //异常处理
- if(endOfFile == dataIndex){
- dataModel.totalBytes = endOfFile;
- dataModel.didUploadBytes = endOfFile;
- dataModel.curUploadStateType = uploadStateDone;
- [fileHandle closeFile];
- return data;
- }
-
- if (endOfFile >= chunkSize) {
-
- // 读取文件的分段数据到某个位置
- [fileHandle seekToFileOffset:dataIndex];
-
- // 读取文件的分段数据
- NSData* chunk = [fileHandle readDataOfLength:chunkSize];
- if (chunk) {
- [data appendData:chunk];
- }
- }
- else{
- // 读取文件的分段数据到某个位置
- [fileHandle seekToFileOffset:dataIndex];
-
- [data appendData:[fileHandle readDataToEndOfFile]];
- }
-
- // 在这里可以对文件内容进行处理
- // ...
-
- // 关闭文件句柄
- [fileHandle closeFile];
- }
-
- return data;
- }
- @end
|