YTKNetWorking 图片上传

使用中碰到的一个坑
我是建立个一个基类,继承YTKRequest然后在此基础上开发的


YTKNetWorking 图片上传_第1张图片
图片.png

图片上传的.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 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 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


    YTKNetWorking 图片上传_第2张图片
    图片.png

    引入到基类中


    YTKNetWorking 图片上传_第3张图片
    图片.png

    使用遇见的问题2
    YTKNetWorking 图片上传_第4张图片
    图片.png

    图中的
    【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://开头的


    YTKNetWorking 图片上传_第5张图片
    图片.png
NSString *fileString = @"file:///Users/paycloud110/Desktop/Snip/ppppp.png";
NSURL *url = [NSURL URLWithString:_imageStringFile];

至此 上传可以了。如果还需要加其他的参数则

// 附加HTTP请求头字段
- (NSDictionary *)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;
    }
}

你可能感兴趣的:(YTKNetWorking 图片上传)