使用中碰到的一個(gè)坑
我是建立個(gè)一個(gè)基類食听,繼承YTKRequest然后在此基礎(chǔ)上開發(fā)的
圖片上傳的.h文件
#import "BasePostRequest.h"
@interface UploadImageRequest : BasePostRequest
- (instancetype)initImage:(UIImage *)image;
- (instancetype)initImageStringFile:(NSString *)imageStringFile;
@end
圖片上傳的.m代碼
#import "UploadImageRequest.h"
@implementation UploadImageRequest
{
UIImage *_image;
NSString *_imageStringFile;
}
- (instancetype)initImage:(UIImage *)image
{
if (self = [super init]) {
_image = image;
}
return self;
}
- (instancetype)initImageStringFile:(NSString *)imageStringFile
{
if (self = [super init]) {
_imageStringFile = imageStringFile;
}
return self;
}
- (NSString *)requestUrl
{
return UploadImage;
}
- (AFConstructingBlock)constructingBodyBlock
{
if (_imageStringFile) {
return ^(id<AFMultipartFormData> formData) {
NSString *fileName = @"ppppp.png";
NSString *name = @"file";
NSString *type = @"image/jpeg";
NSURL *url = [NSURL URLWithString:_imageStringFile];
[formData appendPartWithFileURL:url name:name fileName:fileName mimeType:type error:nil];
};
}else if (_image) {
return ^(id<AFMultipartFormData> formData) {
NSData *data = UIImageJPEGRepresentation(_image, 1);
NSString *fileName = @"ppppp.png";
NSString *name = @"file";
NSString *type = @"image/gif";
[formData appendPartWithFileData:data name:name fileName:fileName mimeType:type];
};
}else {
return nil;
}
}
- (YTKRequestMethod)requestMethod
{
return YTKRequestMethodPOST;
}
- (YTKRequestSerializerType)requestSerializerType
{
return YTKRequestSerializerTypeJSON;
}
@end
使用遇見的問題1
-
進(jìn)去看原來是 AFNetWorking的方法,我還以為YTKNetWorking會(huì)幫助我們導(dǎo)入框架喂窟,這個(gè)他不會(huì)瓤逼。他只會(huì)在他使用到的地方引入售貌。我們需要在我們的基類中引入一下AFNetWorking.h
引入到基類中
使用遇見的問題2
圖中的
【type】這個(gè)是和后臺(tái)人員確認(rèn)一致就行
【filename】必須要后綴名
【name】這個(gè)就是一個(gè)【坑】砚殿,查找YTKNetWorking的寫的就是name=@"image"芽死。但是在圖片上傳中乏梁,這個(gè)字段必須是【file】 - 如果使用FileData上傳 我使用的_image就是[UIImage imageNamed:@"www"]; 這里的名字可以和filename不同,看情況而定吧
- (void)appendPartWithFileData:(NSData *)data
name:(NSString *)name
fileName:(NSString *)fileName
mimeType:(NSString *)mimeType;
-
如果使用FileURL上傳 則傳遞過來的就是url了关贵,就是這個(gè)文件在手機(jī)里面的某個(gè)地方所以是file://開頭的
NSString *fileString = @"file:///Users/paycloud110/Desktop/Snip/ppppp.png";
NSURL *url = [NSURL URLWithString:_imageStringFile];
至此 上傳可以了遇骑。如果還需要加其他的參數(shù)則
// 附加HTTP請(qǐng)求頭字段
- (NSDictionary<NSString *,NSString *> *)requestHeaderFieldValueDictionary
{
return xxxx;
}
在此補(bǔ)上使用原生的來上傳的寫法
- (void)uploadFile:(UIImage *)image
{
NSData *data = UIImagePNGRepresentation(image);
NSURL *url = [NSURL URLWithString:@""];
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
// 根據(jù)需要設(shè)置
data = [self bodyData:data name:@"head" fileName:name];
// 根據(jù)需要設(shè)置
[request setValue:@"multipart/form-data; boundary=mj" forHTTPHeaderField:@"Content-Type"];
// 根據(jù)需要設(shè)置
[request setHTTPMethod:@"POST"];
NSURLSession *session = [NSURLSession sharedSession];
NSURLSessionUploadTask *task = [session uploadTaskWithRequest:request fromData:data completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
dispatch_async(dispatch_get_main_queue(), ^{
xxxxxxx
}];
[task resume];
}
- (NSData *)bodyData:(NSData *)aData name:(NSString *)name fileName:(NSString *)fileName
{
@autoreleasepool {
// 拼接請(qǐng)求體
NSMutableData *data = [NSMutableData data];
// 文件參數(shù)-file
// 文件參數(shù)開始的一個(gè)標(biāo)記
[data appendData:Data(@"--mj\r\n")];
// 文件參數(shù)描述
NSString *nameString = [NSString stringWithFormat:@"Content-Disposition: form-data; name=\"%@\"; filename=\"%@\"\r\n", name, fileName];
[data appendData:Data(nameString)];
// 文件的MINETYPE
[data appendData:Data(@"Content-Type:image/png\r\n")];
// 文件內(nèi)容
[data appendData:Data(@"\r\n")];
[data appendData:aData];
[data appendData:Data(@"\r\n")];
[data appendData:Data(@"--mj--")];
aData = nil;
return data;
}
}