使用中碰到的一个坑
我是建立个一个基类,继承YTKRequest然后在此基础上开发的
图片上传的.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
-
进去看原来是 AFNetWorking的方法,我还以为YTKNetWorking会帮助我们导入框架,这个他不会。他只会在他使用到的地方引入。我们需要在我们的基类中引入一下AFNetWorking.h
引入到基类中
使用遇见的问题2
图中的
【type】这个是和后台人员确认一致就行
【filename】必须要后缀名
【name】这个就是一个【坑】,查找YTKNetWorking的写的就是name=@"image"。但是在图片上传中,这个字段必须是【file】 - 如果使用FileData上传 我使用的_image就是[UIImage imageNamed:@"www"]; 这里的名字可以和filename不同,看情况而定吧
- (void)appendPartWithFileData:(NSData *)data
name:(NSString *)name
fileName:(NSString *)fileName
mimeType:(NSString *)mimeType;
-
如果使用FileURL上传 则传递过来的就是url了,就是这个文件在手机里面的某个地方所以是file://开头的
NSString *fileString = @"file:///Users/paycloud110/Desktop/Snip/ppppp.png";
NSURL *url = [NSURL URLWithString:_imageStringFile];
至此 上传可以了。如果还需要加其他的参数则
// 附加HTTP请求头字段
- (NSDictionary<NSString *,NSString *> *)requestHeaderFieldValueDictionary
{
return xxxx;
}
在此补上使用原生的来上传的写法
- (void)uploadFile:(UIImage *)image
{
NSData *data = UIImagePNGRepresentation(image);
NSURL *url = [NSURL URLWithString:@""];
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
// 根据需要设置
data = [self bodyData:data name:@"head" fileName:name];
// 根据需要设置
[request setValue:@"multipart/form-data; boundary=mj" forHTTPHeaderField:@"Content-Type"];
// 根据需要设置
[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 {
// 拼接请求体
NSMutableData *data = [NSMutableData data];
// 文件参数-file
// 文件参数开始的一个标记
[data appendData:Data(@"--mj\r\n")];
// 文件参数描述
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")];
// 文件内容
[data appendData:Data(@"\r\n")];
[data appendData:aData];
[data appendData:Data(@"\r\n")];
[data appendData:Data(@"--mj--")];
aData = nil;
return data;
}
}