nasUploadFileManager.m 34 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013
  1. //
  2. // nasUploadFileManager.m
  3. // 双子星云手机
  4. //
  5. // Created by xd h on 2024/8/7.
  6. //
  7. #import "nasUploadFileManager.h"
  8. #import "nasUploadManager.h"
  9. @implementation nasUploadFileManager
  10. + (instancetype)shareInstance {
  11. static nasUploadFileManager *_instance;
  12. static dispatch_once_t onceToken;
  13. dispatch_once(&onceToken, ^{
  14. _instance = [[self alloc] init];
  15. });
  16. return _instance;
  17. }
  18. - (id)init
  19. {
  20. self = [super init];
  21. if (self) {
  22. [self initManager];
  23. }
  24. return self;
  25. }
  26. - (void)initManager
  27. {
  28. _maxUploadingNumber = 1;
  29. _uploadingModelArr = [NSMutableArray new];
  30. }
  31. #pragma mark 读取数据库数据
  32. - (void)getDataInDatabaseFun:(BOOL)isReGet complete:(custom_complete_Arr)complete
  33. {
  34. if(_databaseArr && _databaseArr.count == 3 && !isReGet){
  35. complete(_databaseArr);
  36. return;
  37. }
  38. if(!_databaseArr)
  39. {
  40. _databaseArr = [NSMutableArray new];
  41. }
  42. //KWeakSelf
  43. dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0), ^{
  44. // NSLock *lock = [NSLock new];
  45. // [lock lock];
  46. [uploadFileDataModel bg_findAsync:nasUpLoadFile_tableName limit:0 orderBy:nil desc:YES complete:^(NSArray * _Nullable array) {
  47. NSMutableArray *failArr = [NSMutableArray new];
  48. NSMutableArray *doneArr = [NSMutableArray new];
  49. NSMutableArray *otherArr = [NSMutableArray new];
  50. for (uploadFileDataModel * curModel in array) {
  51. //图片 和视频 还原
  52. if(curModel.curUploadFileType == uploadFileTypeImage){
  53. }
  54. else if(curModel.curUploadFileType == uploadFileTypeVideo){
  55. if(curModel.curUploadStateType != uploadStateDone){
  56. }
  57. }
  58. if(curModel.curUploadStateType == uploadStateFail){
  59. [failArr addObject:curModel];
  60. }
  61. else if(curModel.curUploadStateType == uploadStateDone){
  62. [doneArr addObject:curModel];
  63. }
  64. else{
  65. [otherArr addObject:curModel];
  66. }
  67. }
  68. NSLock *lock = [NSLock new];
  69. [lock lock];
  70. NSMutableArray *newArr = [NSMutableArray new];
  71. [newArr addObject:otherArr];
  72. [newArr addObject:doneArr];
  73. [newArr addObject:failArr];
  74. self->_databaseArr = newArr;
  75. [lock unlock];
  76. complete(self->_databaseArr);
  77. }];
  78. // [lock unlock];
  79. });
  80. }
  81. //把TZAssetModel 转成 我们需要上传的model
  82. - (void)handlTZAssetModelToUploadFileDataFunBy:(NSMutableArray*)indexPathsForSelectedItems complete:(custom_complete_Arr)complete
  83. {
  84. if(!indexPathsForSelectedItems && indexPathsForSelectedItems.count == 0){
  85. complete(_databaseArr);
  86. return;
  87. }
  88. if(ksharedAppDelegate.DisabledFileTransferType){
  89. if(ksharedAppDelegate.isImageNewFor130){
  90. [[iToast makeText:NSLocalizedString(@"File_Transfer_Disable_tip",nil)] show];
  91. }
  92. else{
  93. [[iToast makeText:NSLocalizedString(@"File_Transfer_Disable_tip2",nil)] show];
  94. }
  95. complete(_databaseArr);
  96. return;
  97. }
  98. if(!_fileModelDataArr){
  99. _fileModelDataArr = [NSMutableArray new];
  100. }
  101. _isNewAddTaskType = YES;
  102. self.curUploadModelNumbers = indexPathsForSelectedItems.count;
  103. NSMutableArray *newUploadTaskArr = [NSMutableArray new];
  104. NSLock *lock = [NSLock new];
  105. for (TZAssetModel * model in indexPathsForSelectedItems) {
  106. uploadFileDataModel * curModel = [uploadFileDataModel new];
  107. curModel.asset = model.asset;
  108. curModel.localIdentifier = model.asset.localIdentifier;
  109. BOOL isRepeatingTasksType = NO;
  110. [lock lock];
  111. //查询上传任务是否存在
  112. if(_databaseArr && _databaseArr.count == 3 ){
  113. NSMutableArray *uploadingArr = [[NSMutableArray alloc] initWithArray:_databaseArr[0]];
  114. for (uploadFileDataModel *preModel in uploadingArr) {
  115. if([preModel.localIdentifier isEqualToString:curModel.localIdentifier]){
  116. isRepeatingTasksType = YES;
  117. break;
  118. }
  119. }
  120. }
  121. [lock unlock];
  122. if(isRepeatingTasksType){
  123. continue;
  124. }
  125. NSString * uploadDefaultPath = [HWDataManager getStringWithKey:stringKeyAddSn(Const_photo_upload_default_path)];
  126. if(!uploadDefaultPath || uploadDefaultPath.length == 0){
  127. [HWDataManager setStringWithKey:stringKeyAddSn(Const_photo_upload_default_path) value:Const_default_upload_path];
  128. uploadDefaultPath = Const_default_upload_path;
  129. }
  130. //判断最后一个是否是/
  131. NSString *lastStr= [uploadDefaultPath substringFromIndex:uploadDefaultPath.length-1];
  132. if(![lastStr isEqualToString:@"/"]){
  133. uploadDefaultPath = [[NSString alloc] initWithFormat:@"%@/",uploadDefaultPath];
  134. }
  135. //NSString*savePath = [[NSString alloc] initWithFormat:@"%@%@",uploadDefaultPath,filePath];
  136. curModel.savePath = uploadDefaultPath;
  137. // curModel.imageData = model.imageData;
  138. // curModel.videoData = model.videoData;
  139. curModel.filename = [model.asset valueForKey:@"filename"];
  140. //curModel.curUploadStateType = uploadStateWait;
  141. curModel.curUploadStateType = uploadStateUploading;
  142. if(model.type == TZAssetModelMediaTypeVideo){
  143. curModel.curUploadFileType = uploadFileTypeVideo;
  144. [cachesFileManager getFileNameWithContent:curModel.videoData fileName:curModel.filename type:uploadFileTypeVideo];
  145. //curModel.totalBytes = [model.videoData length];
  146. curModel.totalBytes = model.totalBytes;
  147. curModel.videoData = [NSData new];//视频文件存储到文件后内存清空
  148. NSString *imgName1 = [curModel.filename stringByReplacingOccurrencesOfString:@"." withString:@"_"];
  149. curModel.videoFirstImageName = [[NSString alloc] initWithFormat:@"%@.png",imgName1];
  150. //第一帧图片
  151. [[PHImageManager defaultManager] requestImageDataForAsset:curModel.asset options:nil resultHandler:^(NSData * _Nullable imageData, NSString * _Nullable dataUTI, UIImageOrientation orientation, NSDictionary * _Nullable info) {
  152. // 直接得到最终的 NSData 数据
  153. if (imageData) {
  154. curModel.imageData = imageData;
  155. [cachesFileManager getFileNameWithContent:curModel.imageData fileName:curModel.videoFirstImageName type:uploadFileTypeImage];
  156. }
  157. }];
  158. }
  159. else{
  160. curModel.curUploadFileType = uploadFileTypeImage;
  161. curModel.totalBytes = model.totalBytes;
  162. if(curModel.imageData)
  163. {
  164. [cachesFileManager getFileNameWithContent:curModel.imageData fileName:curModel.filename type:uploadFileTypeImage];
  165. curModel.imageData = nil;
  166. }
  167. else{
  168. }
  169. }
  170. //保存到数据库
  171. curModel.bg_tableName = nasUpLoadFile_tableName;
  172. [newUploadTaskArr addObject:curModel];
  173. }
  174. KWeakSelf
  175. if(newUploadTaskArr.count == 0){
  176. [self getDataInDatabaseFun:YES complete:^(NSMutableArray * _Nonnull Arr) {
  177. complete(Arr);
  178. [weakSelf handleUploadFileModelBg_idFun:Arr];
  179. }];
  180. }
  181. else{
  182. [uploadFileDataModel bg_saveOrUpdateArrayAsync:newUploadTaskArr complete:^(BOOL isSuccess) {
  183. [weakSelf getDataInDatabaseFun:YES complete:^(NSMutableArray * _Nonnull Arr) {
  184. complete(Arr);
  185. [weakSelf handleUploadFileModelBg_idFun:Arr];
  186. }];
  187. }];
  188. }
  189. }
  190. #pragma mark 处理当前的model 加上bg_id
  191. - (void)handleUploadFileModelBg_idFun:(NSMutableArray*)totalArr
  192. {
  193. if(!totalArr || totalArr.count != 3){
  194. return;
  195. }
  196. _fileModelDataArr = [NSMutableArray arrayWithArray:totalArr[0]];
  197. [self beginUploadFileFun];
  198. }
  199. - (void)beginUploadFileFun
  200. {
  201. // if(_isUploadIngType && _reUploadIngSelectIndex <= 0){
  202. // return;
  203. // }
  204. BOOL isCanUseCellular = [HWDataManager getBoolWithKey:stringKeyAddSn(Const_file_Transfe_canUse_Cellular_all)];
  205. if(!isCanUseCellular){//不允许流量上传
  206. //
  207. if([AFNetworkReachabilityManager sharedManager].networkReachabilityStatus == AFNetworkReachabilityStatusReachableViaWWAN){
  208. mainBlock(^{
  209. [[NSNotificationCenter defaultCenter] postNotificationName:uploadFileSuspendAllNotification object:nil];
  210. [[iToast makeText:NSLocalizedString(@"File_Transfer_By_Cellular_tip",nil)] show];
  211. });
  212. return;
  213. }
  214. }
  215. if(ksharedAppDelegate.DisabledFileTransferType){
  216. if(ksharedAppDelegate.isImageNewFor130){
  217. [[iToast makeText:NSLocalizedString(@"File_Transfer_Disable_tip",nil)] show];
  218. }
  219. else{
  220. [[iToast makeText:NSLocalizedString(@"File_Transfer_Disable_tip2",nil)] show];
  221. }
  222. return;
  223. }
  224. if(_isSuspendType)
  225. {
  226. return;
  227. }
  228. _isUploadIngType = YES;
  229. if(_uploadingModelArr.count >= _maxUploadingNumber){
  230. return;
  231. }
  232. _curUploadFileDataModel.imageData = nil;
  233. _curUploadFileDataModel.videoData = nil;
  234. _curUploadFileDataModel = nil;
  235. if(_fileModelDataArr.count == 0 && _uploadingModelArr.count == 0){
  236. [self didUploadAllTaskDoneFun];
  237. return;
  238. }
  239. if(_reUploadIngSelectIndex > 0 && _reUploadIngSelectIndex < _fileModelDataArr.count){
  240. _curUploadFileDataModel = _fileModelDataArr[_reUploadIngSelectIndex];
  241. }
  242. else
  243. {
  244. _curUploadFileDataModel = _fileModelDataArr.firstObject;
  245. }
  246. //做个异常处理
  247. if(_databaseArr.count == 3 && _isNewAddTaskType){
  248. NSMutableArray *uploadIngArr = _databaseArr[0];
  249. if(_fileModelDataArr.count != uploadIngArr.count){
  250. _databaseArr[0] = [NSMutableArray arrayWithArray:_fileModelDataArr];
  251. }
  252. }
  253. if(!_curUploadFileDataModel){
  254. return;
  255. }
  256. if(_curUploadFileDataModel.curUploadFileType == uploadFileTypeImage){
  257. NSString*pathStr = [cachesFileManager getFilePathWithName:_curUploadFileDataModel.filename type:_curUploadFileDataModel.curUploadFileType];
  258. _curUploadFileDataModel.imageData = [NSData dataWithContentsOfFile:pathStr];
  259. if(_curUploadFileDataModel.imageData && _curUploadFileDataModel.imageData.length >0){
  260. if(_curUploadFileDataModel.totalBytes == 0){
  261. _curUploadFileDataModel.totalBytes = _curUploadFileDataModel.imageData.length;
  262. }
  263. [self beginGotoUploadDataFun];
  264. return;
  265. }
  266. }
  267. else{
  268. if([cachesFileManager checkFileIsSaveState:_curUploadFileDataModel.filename withType:uploadFileTypeVideo]){
  269. [self beginGotoUploadDataFun];
  270. return;
  271. }
  272. }
  273. if(!_curUploadFileDataModel.asset){
  274. NSString *curLocalIdentifier = _curUploadFileDataModel.localIdentifier;
  275. PHFetchResult *fetchResult = [PHAsset fetchAssetsWithLocalIdentifiers:@[curLocalIdentifier] options:nil];
  276. PHAsset *asset = fetchResult.firstObject;
  277. _curUploadFileDataModel.asset = asset;
  278. }
  279. if(!_curUploadFileDataModel.asset){
  280. self.curUploadFileDataModel.curUploadStateType = uploadStateFail;
  281. [self nasUploadFileChangeingOneFileFunBy:self.curUploadFileDataModel];
  282. return;
  283. }
  284. KWeakSelf
  285. if(_curUploadFileDataModel.curUploadFileType == uploadFileTypeImage)
  286. {
  287. if(!_curUploadFileDataModel.imageData || _curUploadFileDataModel.imageData.length == 0){
  288. [[PHImageManager defaultManager] requestImageDataForAsset:_curUploadFileDataModel.asset options:nil resultHandler:^(NSData * _Nullable imageData, NSString * _Nullable dataUTI, UIImageOrientation orientation, NSDictionary * _Nullable info) {
  289. // 直接得到最终的 NSData 数据
  290. if (imageData) {
  291. self->_curUploadFileDataModel.imageData = imageData;
  292. [weakSelf afterGetImageDataFun];
  293. }
  294. else{
  295. weakSelf.curUploadFileDataModel.curUploadStateType = uploadStateFail;
  296. [weakSelf nasUploadFileChangeingOneFileFunBy:weakSelf.curUploadFileDataModel];
  297. }
  298. }];
  299. }
  300. }
  301. else if(_curUploadFileDataModel.curUploadFileType == uploadFileTypeVideo){
  302. //第一帧图片
  303. [[PHImageManager defaultManager] requestImageDataForAsset:_curUploadFileDataModel.asset options:nil resultHandler:^(NSData * _Nullable imageData, NSString * _Nullable dataUTI, UIImageOrientation orientation, NSDictionary * _Nullable info) {
  304. // 直接得到最终的 NSData 数据
  305. if (imageData) {
  306. weakSelf.curUploadFileDataModel.imageData = imageData;
  307. [weakSelf afterGetImageDataInVideoFun];
  308. }
  309. }];
  310. //真正的视频数据
  311. PHVideoRequestOptions *options = [[PHVideoRequestOptions alloc] init];
  312. options.version = PHVideoRequestOptionsVersionOriginal;
  313. [[PHImageManager defaultManager] requestAVAssetForVideo:_curUploadFileDataModel.asset options:options resultHandler:^(AVAsset *asset, AVAudioMix *audioMix, NSDictionary *info) {
  314. if ([asset isKindOfClass:[AVURLAsset class]]) {
  315. AVURLAsset* urlAsset = (AVURLAsset*)asset;
  316. BOOL isSuc = [cachesFileManager copyVideoItemAtPath:[urlAsset.URL path] fileName:self->_curUploadFileDataModel.filename error:nil];
  317. if (isSuc) {
  318. [weakSelf afterGetVideoDataFun];
  319. }
  320. else{
  321. self->_curUploadFileDataModel.curUploadStateType = uploadStateFail;
  322. [weakSelf nasUploadFileChangeingOneFileFunBy:self->_curUploadFileDataModel];
  323. }
  324. }
  325. else{
  326. weakSelf.curUploadFileDataModel.curUploadStateType = uploadStateFail;
  327. [weakSelf nasUploadFileChangeingOneFileFunBy:weakSelf.curUploadFileDataModel];
  328. }
  329. }];
  330. }
  331. }
  332. #pragma mark 根据 asset 获取到图片数据
  333. - (void)afterGetImageDataFun
  334. {
  335. [cachesFileManager getFileNameWithContent:_curUploadFileDataModel.imageData fileName:_curUploadFileDataModel.filename type:uploadFileTypeImage];
  336. [self beginGotoUploadDataFun];
  337. }
  338. #pragma mark 处理视频第一帧
  339. - (void)afterGetImageDataInVideoFun
  340. {
  341. [cachesFileManager getFileNameWithContent:_curUploadFileDataModel.imageData fileName:_curUploadFileDataModel.videoFirstImageName type:uploadFileTypeImage];
  342. }
  343. #pragma mark 处理视频数据
  344. - (void)afterGetVideoDataFun
  345. {
  346. [self beginGotoUploadDataFun];
  347. }
  348. #pragma mark 开始上传
  349. - (void)beginGotoUploadDataFun{
  350. [self checkFileUploadStateFun];
  351. }
  352. #pragma mark 检测文件是否上传过 或者云机里存在文件了
  353. - (void)checkFileUploadStateFun
  354. {
  355. NSMutableDictionary*paraDict = [NSMutableDictionary new];
  356. if(_curUploadFileDataModel.savePath){
  357. NSString *absPath = [[NSString alloc] initWithFormat:@"%@%@",_curUploadFileDataModel.savePath,_curUploadFileDataModel.filename];
  358. [paraDict setValue:absPath forKey:@"absPath"];
  359. NSNumber *totalBytesNumber = [NSNumber numberWithLong:_curUploadFileDataModel.totalBytes];
  360. [paraDict setValue:totalBytesNumber forKey:@"fileSize"];
  361. }
  362. KWeakSelf
  363. [[netWorkManager shareInstance] cloudPhoneGETCallBackCode:@"isFileExist" Parameters:paraDict success:^(id _Nonnull responseObject) {
  364. frpFileExistModel *model = [[frpFileExistModel alloc] initWithDictionary:responseObject error:nil];
  365. if(model && model.status == 0){
  366. [weakSelf checkFileUploadStateFunAfterNetWith:model];
  367. }
  368. else{
  369. [weakSelf checkFileUploadStateFunAfterNetWith:nil];
  370. }
  371. } failure:^(NSError * _Nonnull error) {
  372. HLog(@"%@",error)
  373. [weakSelf checkFileUploadStateFunAfterNetWith:nil];
  374. }];
  375. }
  376. - (void)checkFileUploadStateFunAfterNetWith:(frpFileExistModel*)model
  377. {
  378. if(!model){
  379. [self beginUploadFileFun];
  380. return;
  381. }
  382. _curUploadFileDataModel.didUploadBytes = 0;
  383. _curUploadFileDataModel.taskId = model.data.taskId;
  384. if(!model.data.exist){//未上传过
  385. [self realUploadAfterCheckFileUploadStateFun];
  386. }
  387. else if(model.data.isComplete){//上传过了 并且文件上传完了
  388. //判断下文件创建长度是否一致 一致则是上传完了 不一致 重新上传一个 可能是同名的文件而已
  389. // if(model.data.size >= _curUploadFileDataModel.totalBytes){//上传完了
  390. // HLog(@"222");
  391. // }
  392. // else{
  393. //
  394. // }
  395. [self handleTaskDidUploadWith:_curUploadFileDataModel];
  396. }
  397. else{//上传过了 未上传完成
  398. _curUploadFileDataModel.didUploadBytes = model.data.size;
  399. [self realUploadAfterCheckFileUploadStateFun];
  400. }
  401. }
  402. #pragma mark 文件上传在云机已经存在
  403. - (void)handleTaskDidUploadWith:(uploadFileDataModel*)didUploadModel
  404. {
  405. mainBlock(^{
  406. [[iToast makeText:NSLocalizedString(@"File_upload_file_already_exists",nil)] show];
  407. });
  408. NSMutableArray *delArr = [NSMutableArray new];
  409. [delArr addObject:didUploadModel];
  410. [[nasUploadFileManager shareInstance] deleteUploadFileRecordBy:delArr withDelCache:NO complete:^(BOOL isSuccess) {
  411. if (isSuccess) {
  412. }
  413. }];
  414. }
  415. #pragma mark 检测文件是否上传过 或者云机里存在文件了
  416. - (void)realUploadAfterCheckFileUploadStateFun
  417. {
  418. BOOL isNewTask = YES;
  419. for (uploadFileDataModel *preModel in _uploadingModelArr) {
  420. if(preModel.bg_id.integerValue == _curUploadFileDataModel.bg_id.integerValue){
  421. isNewTask = NO;
  422. break;
  423. }
  424. }
  425. [_fileModelDataArr removeObject:_curUploadFileDataModel];
  426. if(isNewTask){
  427. [_uploadingModelArr addObject:_curUploadFileDataModel];
  428. }
  429. else{
  430. [self beginUploadFileFun];
  431. return;
  432. }
  433. __block uploadFileDataModel *curUploadModel = [_curUploadFileDataModel copy];
  434. _curUploadFileDataModel = nil;
  435. KWeakSelf
  436. [[nasUploadManager shareInstance] beginUploadDataBy:curUploadModel success:^(id _Nonnull responseObject) {
  437. HLog(@"beginGotoUploadDataFun 接收到上传完成")
  438. frpUploadModel *model = [[frpUploadModel alloc] initWithDictionary:responseObject error:nil];
  439. if(model && model.position == curUploadModel.totalBytes){
  440. curUploadModel.curUploadStateType = uploadStateDone;
  441. [weakSelf nasUploadFileChangeingOneFileFunBy:curUploadModel];
  442. [weakSelf uploadFileDoneOneFunWith:curUploadModel];
  443. [weakSelf deleteCacheDataBy:curUploadModel];
  444. }
  445. } faild:^(NSError * _Nonnull error) {
  446. curUploadModel.curUploadStateType = uploadStateFail;
  447. [weakSelf nasUploadFileChangeingOneFileFunBy:curUploadModel];
  448. [weakSelf uploadFileFailOneFunWith:curUploadModel];
  449. [weakSelf deleteCacheDataBy:curUploadModel];
  450. }];
  451. [self beginUploadFileFun];
  452. }
  453. #pragma mark 上传完成 清理缓存
  454. - (void)deleteCacheDataBy:(uploadFileDataModel*)uploadFileDataMod
  455. {
  456. uploadFileDataMod.imageData = nil;
  457. uploadFileDataMod.videoData = nil;
  458. if(uploadFileDataMod.curUploadFileType == uploadFileTypeVideo){
  459. [cachesFileManager removeItemAtPath:uploadFileDataMod.filename type:uploadFileTypeVideo error:nil];
  460. }
  461. uploadFileDataMod = nil;
  462. }
  463. #pragma mark 更新数据状态
  464. - (void)nasUploadFileChangeingOneFileFunBy:(uploadFileDataModel*)dataModel
  465. {
  466. if(dataModel.curUploadStateType == uploadStateDone){
  467. //[_fileModelDataArr removeObject:dataModel];
  468. [self handleDatabaseArrDeleteObjectInUploading:dataModel];
  469. [self handleDatabaseArrAddObjectInDone:dataModel];
  470. }
  471. else if(dataModel.curUploadStateType == uploadStateFail){
  472. //[_fileModelDataArr removeObject:dataModel];
  473. //删除操作导致的失败
  474. NSMutableArray *ingArr = _databaseArr[0];
  475. NSInteger count = ingArr.count;
  476. if(count == 0){
  477. return;
  478. }
  479. [self handleDatabaseArrDeleteObjectInUploading:dataModel];
  480. [self handleDatabaseArrAddObjectInFail:dataModel];
  481. }
  482. dataModel.bg_tableName = nasUpLoadFile_tableName;
  483. [dataModel bg_saveOrUpdateAsync:^(BOOL isSuccess) {
  484. HLog(@"%@ 写入 %@", dataModel.filename, isSuccess ? @"成功":@"失败");
  485. }];
  486. if(!_isSuspendType || dataModel.curUploadStateType != uploadStateSuspend){
  487. [[NSNotificationCenter defaultCenter] postNotificationName:uploadFileRefreshNotification object:dataModel];
  488. }
  489. }
  490. #pragma mark 删除上传中的任务
  491. - (void)handleDatabaseArrDeleteObjectInUploading:(uploadFileDataModel*)model
  492. {
  493. NSLock *lock = [NSLock new];
  494. [lock lock];
  495. if(_databaseArr && _databaseArr.count == 3 ){
  496. NSMutableArray *ingArr = _databaseArr[0];
  497. NSInteger count = ingArr.count;
  498. [ingArr removeObject:model];
  499. NSInteger atferDelCount = ingArr.count;
  500. if(count == atferDelCount){
  501. for (couldPhoneFileModel*preModel in ingArr) {
  502. if(preModel.bg_id.integerValue == model.bg_id.integerValue){
  503. [ingArr removeObject:preModel];
  504. break;
  505. }
  506. }
  507. }
  508. }
  509. [lock unlock];
  510. }
  511. #pragma mark 添加任务到上传完成
  512. - (void)handleDatabaseArrAddObjectInDone:(uploadFileDataModel*)model
  513. {
  514. NSLock *lock = [NSLock new];
  515. [lock lock];
  516. if(_databaseArr && _databaseArr.count == 3 ){
  517. NSMutableArray *doneArr = _databaseArr[1];
  518. if(model){
  519. [doneArr insertObject:model atIndex:0];
  520. }
  521. }
  522. [lock unlock];
  523. }
  524. #pragma mark 添加任务到上传失败
  525. - (void)handleDatabaseArrAddObjectInFail:(uploadFileDataModel*)model
  526. {
  527. NSLock *lock = [NSLock new];
  528. [lock lock];
  529. if(_databaseArr && _databaseArr.count == 3 ){
  530. NSMutableArray *failArr = _databaseArr[2];
  531. if(model){
  532. [failArr insertObject:model atIndex:0];
  533. }
  534. }
  535. [lock unlock];
  536. }
  537. #pragma mark 上传完成一个任务
  538. - (void)uploadFileDoneOneFunWith:(uploadFileDataModel*)dataModel
  539. {
  540. @synchronized (self) {
  541. for (uploadFileDataModel*uploadingModel in _uploadingModelArr) {
  542. if(uploadingModel.bg_id.intValue == dataModel.bg_id.intValue
  543. && [uploadingModel.filename isEqualToString:dataModel.filename]){
  544. [_uploadingModelArr removeObject:uploadingModel];
  545. break;
  546. }
  547. }
  548. }
  549. [self beginUploadFileFun];
  550. }
  551. #pragma mark 上传失败一个任务
  552. - (void)uploadFileFailOneFunWith:(uploadFileDataModel*)dataModel
  553. {
  554. @synchronized (self) {
  555. for (uploadFileDataModel*uploadingModel in _uploadingModelArr) {
  556. if(uploadingModel.bg_id.intValue == dataModel.bg_id.intValue
  557. && [uploadingModel.filename isEqualToString:dataModel.filename]){
  558. [_uploadingModelArr removeObject:uploadingModel];
  559. break;
  560. }
  561. }
  562. }
  563. [self beginUploadFileFun];
  564. }
  565. #pragma mark 上传完成所有任务
  566. - (void)didUploadAllTaskDoneFun
  567. {
  568. self->_isUploadIngType = NO;
  569. self->_curUploadFileDataModel = nil;
  570. [[NSNotificationCenter defaultCenter] postNotificationName:uploadFileAllTaskDoneNotification object:nil];
  571. }
  572. #pragma mark 删除内存数据记录
  573. - (void)handleDatabaseArrByDelete:(uploadFileDataModel*)delModel
  574. {
  575. if(_databaseArr && _databaseArr.count == 3 ){
  576. NSMutableArray *uploadingArr = nil;
  577. if(delModel.curUploadStateType == uploadStateUploading
  578. ||delModel.curUploadStateType == uploadStateSuspend
  579. ||delModel.curUploadStateType == uploadStateWait){
  580. uploadingArr = _databaseArr[0];
  581. }
  582. else if(delModel.curUploadStateType == uploadStateDone)
  583. {
  584. uploadingArr = _databaseArr[1];
  585. }
  586. else{
  587. uploadingArr = _databaseArr[2];
  588. }
  589. [uploadingArr removeObject:delModel];
  590. }
  591. }
  592. #pragma mark 删除本地数据库记录
  593. - (void)deleteUploadFileRecordBy:(NSMutableArray *)delArr withDelCache:(BOOL)isDelCache complete:(custom_complete_B)complete
  594. {
  595. //
  596. BOOL isDelUploadingModel = NO;
  597. NSMutableArray *curDelArr = [NSMutableArray arrayWithArray:delArr];
  598. for (uploadFileDataModel *uploadFileDataMod in curDelArr) {
  599. //1.删除数据库
  600. NSMutableString* where = [[NSMutableString alloc] initWithString:@"where "];
  601. NSString *curStr = [NSString stringWithFormat:@"%@=%@ ",bg_sqlKey(@"bg_id"),bg_sqlValue(uploadFileDataMod.bg_id)];
  602. [where appendString:curStr];
  603. //isSuc = [uploadFileDataModel bg_delete:nasUpLoadFile_tableName where:where];
  604. [uploadFileDataModel bg_deleteAsync:nasUpLoadFile_tableName where:where complete:^(BOOL isSuccess) {
  605. if(isSuccess){
  606. }
  607. }];
  608. // 2.删除内存数据
  609. [self handleDatabaseArrByDelete:uploadFileDataMod];
  610. //3.删除缓存的本地数据
  611. if(isDelCache){
  612. //判断是否可以删除本地缓存
  613. if(_databaseArr && _databaseArr.count == 3 ){
  614. NSMutableArray *uploadingArr = _databaseArr[0];
  615. NSMutableArray *uploadDoneArr = _databaseArr[1];
  616. NSMutableArray *uploadFailArr = _databaseArr[2];
  617. BOOL isNeedDel = YES;
  618. for (uploadFileDataModel *baseUploadFileDataMod in uploadingArr) {
  619. if([uploadFileDataMod.filename isEqualToString:baseUploadFileDataMod.filename] ){
  620. isNeedDel = NO;
  621. break;
  622. }
  623. }
  624. if(isNeedDel){
  625. for (uploadFileDataModel *baseUploadFileDataMod in uploadDoneArr) {
  626. if([uploadFileDataMod.filename isEqualToString:baseUploadFileDataMod.filename] ){
  627. isNeedDel = NO;
  628. break;
  629. }
  630. }
  631. }
  632. if(isNeedDel){
  633. for (uploadFileDataModel *baseUploadFileDataMod in uploadFailArr) {
  634. if([uploadFileDataMod.filename isEqualToString:baseUploadFileDataMod.filename] ){
  635. isNeedDel = NO;
  636. break;
  637. }
  638. }
  639. }
  640. if(isNeedDel){
  641. if(uploadFileDataMod.curUploadFileType == uploadFileTypeVideo){
  642. [cachesFileManager removeItemAtPath:uploadFileDataMod.videoFirstImageName type:uploadFileTypeImage error:nil];
  643. [cachesFileManager removeItemAtPath:uploadFileDataMod.filename type:uploadFileTypeVideo error:nil];
  644. }
  645. else{
  646. [cachesFileManager removeItemAtPath:uploadFileDataMod.filename type:uploadFileTypeImage error:nil];
  647. }
  648. }
  649. }
  650. }
  651. if(!isDelCache){//上传报云机已经存在文件了 查询本地是否有任务记录
  652. [self handleRetryUploadAndDelRecordFun:uploadFileDataMod];
  653. }
  654. //是否在删除上传中的任务
  655. if(_fileModelDataArr && _fileModelDataArr.count >0)
  656. {
  657. for (uploadFileDataModel *curUploadFileDataMod in _fileModelDataArr)
  658. {
  659. if(curUploadFileDataMod.bg_id.integerValue == uploadFileDataMod.bg_id.integerValue){
  660. [_fileModelDataArr removeObject:curUploadFileDataMod];
  661. break;
  662. }
  663. }
  664. }
  665. if(!isDelUploadingModel){
  666. if(_uploadingModelArr && _uploadingModelArr.count >0)
  667. {
  668. for (uploadFileDataModel *curUploadFileDataMod in _uploadingModelArr)
  669. {
  670. if(curUploadFileDataMod.bg_id.integerValue == uploadFileDataMod.bg_id.integerValue){
  671. isDelUploadingModel = YES;
  672. [[nasUploadManager shareInstance] cancelUploadTaskFun];
  673. break;
  674. }
  675. }
  676. }
  677. }
  678. }
  679. if(isDelUploadingModel){
  680. if(!_uploadingModelArr || _uploadingModelArr.count ==0){
  681. _isUploadIngType = NO;
  682. }
  683. if(_fileModelDataArr.count >=1){
  684. [self beginUploadFileFun];
  685. }
  686. else{
  687. _curUploadFileDataModel = nil;
  688. _isSuspendType = NO;
  689. }
  690. }
  691. uploadFileDataModel *RefreshUploadFileDataMod = nil;
  692. if(delArr.count >= 1){
  693. RefreshUploadFileDataMod = delArr.firstObject;
  694. }
  695. [[NSNotificationCenter defaultCenter] postNotificationName:uploadFileRefreshNotification object:RefreshUploadFileDataMod];
  696. complete(YES);
  697. }
  698. #pragma mark 处理重复上传文件的问题
  699. - (void)handleRetryUploadAndDelRecordFun:(uploadFileDataModel *)uploadFileDataMod
  700. {
  701. NSLock *lock = [NSLock new];
  702. [lock lock];
  703. if(!_databaseArr && _databaseArr.count != 3){
  704. return;
  705. }
  706. NSMutableArray * doneArr = _databaseArr[1];
  707. NSMutableArray * failArr = _databaseArr[2];
  708. BOOL isNeedDelType = YES;
  709. for (uploadFileDataModel *doneModel in doneArr) {
  710. if([doneModel.localIdentifier isEqualToString:uploadFileDataMod.localIdentifier]){
  711. isNeedDelType = NO;
  712. break;
  713. }
  714. }
  715. if(isNeedDelType){
  716. for (uploadFileDataModel *failModel in failArr) {
  717. if([failModel.localIdentifier isEqualToString:uploadFileDataMod.localIdentifier]){
  718. isNeedDelType = NO;
  719. break;
  720. }
  721. }
  722. }
  723. if(isNeedDelType){
  724. if(uploadFileDataMod.curUploadFileType == uploadFileTypeVideo){
  725. [cachesFileManager removeItemAtPath:uploadFileDataMod.videoFirstImageName type:uploadFileTypeImage error:nil];
  726. [cachesFileManager removeItemAtPath:uploadFileDataMod.filename type:uploadFileTypeVideo error:nil];
  727. }
  728. else{
  729. [cachesFileManager removeItemAtPath:uploadFileDataMod.filename type:uploadFileTypeImage error:nil];
  730. }
  731. }
  732. else{//视频文件是要删除的
  733. if(uploadFileDataMod.curUploadFileType == uploadFileTypeVideo){
  734. [cachesFileManager removeItemAtPath:uploadFileDataMod.filename type:uploadFileTypeVideo error:nil];
  735. }
  736. }
  737. [lock unlock];
  738. }
  739. - (void)checkHadUploadTaskWithComplete:(custom_complete_B)complete
  740. {
  741. [self getDataInDatabaseFun:NO complete:^(NSMutableArray * _Nonnull Arr) {
  742. mainBlock(^{
  743. if(!Arr || Arr.count != 3){
  744. complete(NO);
  745. }
  746. else{
  747. NSArray *firstArr = Arr[0];
  748. if(firstArr.count >0){
  749. complete(YES);
  750. }
  751. else{
  752. complete(NO);
  753. }
  754. }
  755. });
  756. }];
  757. }
  758. //文件重新上传
  759. - (void)reUploadFileFunBy:(NSMutableArray*)Arr withAll:(BOOL)isAllType
  760. {
  761. if(!Arr || Arr.count == 0){
  762. return;
  763. }
  764. if(!_fileModelDataArr){
  765. _fileModelDataArr = [NSMutableArray new];
  766. }
  767. //1.修改状态从失败改为上传中
  768. for (uploadFileDataModel * model in Arr) {
  769. model.curUploadStateType = uploadStateUploading;
  770. //修改已经读取的内存数据
  771. NSMutableArray * failArr = _databaseArr[2];
  772. for (uploadFileDataModel * failModel in failArr) {
  773. if(model.bg_id.integerValue == failModel.bg_id.integerValue){
  774. [failArr removeObject:failModel];
  775. break;
  776. }
  777. }
  778. //判断是否是新任务
  779. BOOL isNewTask = YES;
  780. for (uploadFileDataModel *preModel in _fileModelDataArr) {
  781. if(preModel.bg_id.integerValue == model.bg_id.integerValue){
  782. isNewTask = NO;
  783. break;
  784. }
  785. }
  786. //添加到等待上传列表
  787. if(isNewTask){
  788. [_fileModelDataArr insertObject:model atIndex:0];
  789. }
  790. }
  791. //2、保存到数控库
  792. [uploadFileDataModel bg_saveOrUpdateArrayAsync:Arr complete:^(BOOL isSuccess) {
  793. }];
  794. //开始上传
  795. [self beginUploadFileFun];
  796. }
  797. //暂停上传 当 isSuspendAll为NO时候 传指定暂停哪一个
  798. - (void)suspendUploadFileFun:(BOOL)isSuspendAll withModel:(uploadFileDataModel*)model
  799. {
  800. [[nasUploadManager shareInstance] cancelUploadTaskFun];
  801. [self deleteUploadingTaskBy:isSuspendAll withModel:model];
  802. }
  803. #pragma mark 删除任务
  804. - (void)deleteUploadingTaskBy:(BOOL)isDeleteAll withModel:(uploadFileDataModel*)model
  805. {
  806. if(isDeleteAll){
  807. [_fileModelDataArr removeAllObjects];
  808. [_uploadingModelArr removeAllObjects];
  809. }
  810. else{
  811. //更新数据库
  812. [uploadFileDataModel bg_saveOrUpdateArrayAsync:@[model] complete:^(BOOL isSuccess) {
  813. }];
  814. for (uploadFileDataModel *preModel in _fileModelDataArr) {
  815. if(preModel.bg_id.integerValue == model.bg_id.integerValue){
  816. [_fileModelDataArr removeObject:preModel];
  817. break;
  818. }
  819. }
  820. for (uploadFileDataModel *preModel in _uploadingModelArr) {
  821. if(preModel.bg_id.integerValue == model.bg_id.integerValue){
  822. [_uploadingModelArr removeObject:preModel];
  823. break;
  824. }
  825. }
  826. [self beginUploadFileFun];
  827. }
  828. }
  829. @end