QNPartsUploadPerformerV2.m 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148
  1. //
  2. // QNPartsUploadApiV2.m
  3. // QiniuSDK
  4. //
  5. // Created by yangsen on 2020/11/30.
  6. // Copyright © 2020 Qiniu. All rights reserved.
  7. //
  8. #import "QNLogUtil.h"
  9. #import "QNDefine.h"
  10. #import "QNRequestTransaction.h"
  11. #import "QNUploadInfoV2.h"
  12. #import "QNPartsUploadPerformerV2.h"
  13. @interface QNPartsUploadPerformerV2()
  14. @end
  15. @implementation QNPartsUploadPerformerV2
  16. - (QNUploadInfo *)getFileInfoWithDictionary:(NSDictionary *)fileInfoDictionary {
  17. return [QNUploadInfoV2 info:self.uploadSource dictionary:fileInfoDictionary];
  18. }
  19. - (QNUploadInfo *)getDefaultUploadInfo {
  20. return [QNUploadInfoV2 info:self.uploadSource configuration:self.config];
  21. }
  22. - (void)serverInit:(void(^)(QNResponseInfo * _Nullable responseInfo,
  23. QNUploadRegionRequestMetrics * _Nullable metrics,
  24. NSDictionary * _Nullable response))completeHandler {
  25. QNUploadInfoV2 *uploadInfo = (QNUploadInfoV2 *)self.uploadInfo;
  26. if (uploadInfo && [uploadInfo isValid]) {
  27. QNLogInfo(@"key:%@ serverInit success", self.key);
  28. QNResponseInfo *responseInfo = [QNResponseInfo successResponse];
  29. completeHandler(responseInfo, nil, nil);
  30. return;
  31. }
  32. QNRequestTransaction *transaction = [self createUploadRequestTransaction];
  33. kQNWeakSelf;
  34. kQNWeakObj(transaction);
  35. [transaction initPart:^(QNResponseInfo * _Nullable responseInfo, QNUploadRegionRequestMetrics * _Nullable metrics, NSDictionary * _Nullable response) {
  36. kQNStrongSelf;
  37. kQNStrongObj(transaction);
  38. NSString *uploadId = response[@"uploadId"];
  39. NSNumber *expireAt = response[@"expireAt"];
  40. if (responseInfo.isOK && uploadId && expireAt) {
  41. uploadInfo.uploadId = uploadId;
  42. uploadInfo.expireAt = expireAt;
  43. [self recordUploadInfo];
  44. }
  45. completeHandler(responseInfo, metrics, response);
  46. [self destroyUploadRequestTransaction:transaction];
  47. }];
  48. }
  49. - (void)uploadNextData:(void(^)(BOOL stop,
  50. QNResponseInfo * _Nullable responseInfo,
  51. QNUploadRegionRequestMetrics * _Nullable metrics,
  52. NSDictionary * _Nullable response))completeHandler {
  53. QNUploadInfoV2 *uploadInfo = (QNUploadInfoV2 *)self.uploadInfo;
  54. NSError *error = nil;
  55. QNUploadData *data = nil;
  56. @synchronized (self) {
  57. data = [uploadInfo nextUploadData:&error];
  58. data.state = QNUploadStateUploading;
  59. }
  60. if (error) {
  61. QNResponseInfo *responseInfo = [QNResponseInfo responseInfoWithLocalIOError:[NSString stringWithFormat:@"%@", error]];
  62. completeHandler(YES, responseInfo, nil, nil);
  63. return;
  64. }
  65. // 上传完毕
  66. if (data == nil) {
  67. QNLogInfo(@"key:%@ no data left", self.key);
  68. QNResponseInfo *responseInfo = nil;
  69. if (uploadInfo.getSourceSize == 0) {
  70. responseInfo = [QNResponseInfo responseInfoOfZeroData:@"file is empty"];
  71. } else {
  72. responseInfo = [QNResponseInfo responseInfoWithSDKInteriorError:@"no chunk left"];
  73. }
  74. completeHandler(YES, responseInfo, nil, nil);
  75. return;
  76. }
  77. kQNWeakSelf;
  78. void (^progress)(long long, long long) = ^(long long totalBytesWritten, long long totalBytesExpectedToWrite){
  79. kQNStrongSelf;
  80. data.uploadSize = totalBytesWritten;
  81. [self notifyProgress:false];
  82. };
  83. QNRequestTransaction *transaction = [self createUploadRequestTransaction];
  84. kQNWeakObj(transaction);
  85. [transaction uploadPart:uploadInfo.uploadId
  86. partIndex:[uploadInfo getPartIndexOfData:data]
  87. partData:data.data
  88. progress:progress
  89. complete:^(QNResponseInfo * _Nullable responseInfo, QNUploadRegionRequestMetrics * _Nullable metrics, NSDictionary * _Nullable response) {
  90. kQNStrongSelf;
  91. kQNStrongObj(transaction);
  92. NSString *etag = response[@"etag"];
  93. NSString *md5 = response[@"md5"];
  94. if (responseInfo.isOK && etag && md5) {
  95. data.etag = etag;
  96. data.state = QNUploadStateComplete;
  97. [self recordUploadInfo];
  98. [self notifyProgress:false];
  99. } else {
  100. data.state = QNUploadStateWaitToUpload;
  101. }
  102. completeHandler(NO, responseInfo, metrics, response);
  103. [self destroyUploadRequestTransaction:transaction];
  104. }];
  105. }
  106. - (void)completeUpload:(void(^)(QNResponseInfo * _Nullable responseInfo,
  107. QNUploadRegionRequestMetrics * _Nullable metrics,
  108. NSDictionary * _Nullable response))completeHandler {
  109. QNUploadInfoV2 *uploadInfo = (QNUploadInfoV2 *)self.uploadInfo;
  110. NSArray *partInfoArray = [uploadInfo getPartInfoArray];
  111. QNRequestTransaction *transaction = [self createUploadRequestTransaction];
  112. kQNWeakSelf;
  113. kQNWeakObj(transaction);
  114. [transaction completeParts:self.fileName uploadId:uploadInfo.uploadId partInfoArray:partInfoArray complete:^(QNResponseInfo * _Nullable responseInfo, QNUploadRegionRequestMetrics * _Nullable metrics, NSDictionary * _Nullable response) {
  115. kQNStrongSelf;
  116. kQNStrongObj(transaction);
  117. if (responseInfo.isOK) {
  118. [self notifyProgress:true];
  119. }
  120. completeHandler(responseInfo, metrics, response);
  121. [self destroyUploadRequestTransaction:transaction];
  122. }];
  123. }
  124. @end