1
This commit is contained in:
@@ -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 {
|
||||
|
||||
Reference in New Issue
Block a user