This commit is contained in:
2025-12-04 13:37:11 +08:00
parent f770f8055e
commit b216ddaa61
11 changed files with 377 additions and 10 deletions

View File

@@ -186,6 +186,98 @@ autoShowBusinessError:YES
return [self startDataTaskWithRequest:req completion:completion];
}
#pragma mark - Upload (multipart/form-data)
- (NSURLSessionDataTask *)uploadFile:(NSString *)path
fileData:(NSData *)fileData
fileName:(NSString *)fileName
mimeType:(NSString *)mimeType
headers:(NSDictionary<NSString *,NSString *> *)headers
autoShowBusinessError:(BOOL)autoShowBusinessError
completion:(KBNetworkCompletion)completion
{
NSLog(@"[KBNetworkManager] UPLOAD called, enabled=%d, path=%@", self.isEnabled, path);
if (![self ensureEnabled:completion]) return nil;
NSString *urlString = [self buildURLStringWithPath:path];
if (!urlString) {
[self fail:KBNetworkErrorInvalidURL completion:completion];
return nil;
}
if (!fileData || fileData.length == 0) {
NSError *e = [NSError errorWithDomain:KBNetworkErrorDomain
code:KBNetworkErrorInvalidResponse
userInfo:@{NSLocalizedDescriptionKey: KBLocalized(@"Empty file data")}];
if (completion) completion(nil, nil, e);
return nil;
}
AFHTTPRequestSerializer *serializer = [AFHTTPRequestSerializer serializer];
serializer.timeoutInterval = self.timeout;
NSError *error = nil;
NSMutableURLRequest *req =
[serializer multipartFormRequestWithMethod:@"POST"
URLString:urlString
parameters:nil
constructingBodyWithBlock:^(id<AFMultipartFormData> _Nonnull formData) {
// Apifox "file"
NSString *fieldName = @"file";
NSString *fname = fileName ?: @"file";
NSString *type = mimeType ?: @"application/octet-stream";
[formData appendPartWithFileData:fileData
name:fieldName
fileName:fname
mimeType:type];
} error:&error];
if (error || !req) {
if (completion) {
completion(nil, nil,
error ?: [NSError errorWithDomain:KBNetworkErrorDomain
code:KBNetworkErrorInvalidURL
userInfo:@{NSLocalizedDescriptionKey: KBLocalized(@"Invalid upload request")}]);
}
return nil;
}
// Content-Type AFN boundary
[self applyHeaders:headers toMutableRequest:req contentType:nil];
#if DEBUG
KBLOG(@"HTTP UPLOAD (multipart)\nURL: %@\nHeaders: %@\nfileName: %@\nlength: %lu",
req.URL.absoluteString,
req.allHTTPHeaderFields ?: @{},
fileName,
(unsigned long)fileData.length);
#endif
// JSON POST {code,message,data,...}
return [self startJSONTaskWithRequest:req
autoShowBusinessError:autoShowBusinessError
completion:completion];
}
- (NSURLSessionDataTask *)uploadFile:(NSString *)path
fileData:(NSData *)fileData
fileName:(NSString *)fileName
mimeType:(NSString *)mimeType
headers:(NSDictionary<NSString *,NSString *> *)headers
completion:(KBNetworkCompletion)completion
{
return [self uploadFile:path
fileData:fileData
fileName:fileName
mimeType:mimeType
headers:headers
autoShowBusinessError:YES
completion:completion];
}
#pragma mark - Core
- (BOOL)ensureEnabled:(KBNetworkCompletion)completion {