将图像上传到服务器 初学者的详细说明

Uploading image to server Detail Explanation for Beginner

我正在努力将过去两天的图像上传到服务器,因为有很多关于通过 AFNetworking 和 NSURLSession 上传图像的问题以及其他上传方法我想问的是我没有找到一个单一的答案解释了关于事物如何工作以及引擎盖下发生了什么的整个概念我搜索了 youtube 也所有的东西都在 Swift 中可用并且相信我根本没有解释并且从我的结果我找到了这个答案我觉得很眼熟



    //Init the NSURLSession with a configuration
NSURLSessionConfiguration *defaultConfigObject = [NSURLSessionConfiguration defaultSessionConfiguration];
NSURLSession *defaultSession = [NSURLSession sessionWithConfiguration: defaultConfigObject delegate: nil delegateQueue: [NSOperationQueue mainQueue]];

//Create an URLRequest
NSURL *url = [NSURL URLWithString:@"yourURL"];
NSMutableURLRequest *urlRequest = [NSMutableURLRequest requestWithURL:url];

//Create POST Params and add it to HTTPBody
NSString *params = @"api_key=APIKEY&email=example@example.com&password=password";
[urlRequest setHTTPMethod:@"POST"];
[urlRequest setHTTPBody:[params dataUsingEncoding:NSUTF8StringEncoding]];

//Create task
NSURLSessionDataTask *dataTask = [defaultSession dataTaskWithRequest:urlRequest completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {
    //Handle your response here
}];

[dataTask resume];


用户 XJones 关于此主题的最热门答案是:-

Here's code from my app to post an image to our web server:

// Dictionary that holds post parameters. You can set your post parameters that your server accepts or programmed to accept.
NSMutableDictionary* _params = [[NSMutableDictionary alloc] init];
[_params setObject:[NSString stringWithString:@"1.0"] forKey:[NSString stringWithString:@"ver"]];
[_params setObject:[NSString stringWithString:@"en"] forKey:[NSString stringWithString:@"lan"]];
[_params setObject:[NSString stringWithFormat:@"%d", userId] forKey:[NSString stringWithString:@"userId"]];
[_params setObject:[NSString stringWithFormat:@"%@",title] forKey:[NSString stringWithString:@"title"]];

// the boundary string : a random string, that will not repeat in post data, to separate post data fields.
NSString *BoundaryConstant = [NSString stringWithString:@"----------V2ymHFg03ehbqgZCaKO6jy"];

// string constant for the post parameter 'file'. My server uses this name: `file`. Your's may differ 
NSString* FileParamConstant = [NSString stringWithString:@"file"];

// the server url to which the image (or the media) is uploaded. Use your server url here
NSURL* requestURL = [NSURL URLWithString:@""]; 

// create request
NSMutableURLRequest *request = [[NSMutableURLRequest alloc] init];                                    
[request setCachePolicy:NSURLRequestReloadIgnoringLocalCacheData];
[request setHTTPShouldHandleCookies:NO];
[request setTimeoutInterval:30];
[request setHTTPMethod:@"POST"];

// set Content-Type in HTTP header
NSString *contentType = [NSString stringWithFormat:@"multipart/form-data; boundary=%@", BoundaryConstant];
[request setValue:contentType forHTTPHeaderField: @"Content-Type"];

// post body
NSMutableData *body = [NSMutableData data];

// add params (all params are strings)
for (NSString *param in _params) {
    [body appendData:[[NSString stringWithFormat:@"--%@\r\n", BoundaryConstant] dataUsingEncoding:NSUTF8StringEncoding]];
    [body appendData:[[NSString stringWithFormat:@"Content-Disposition: form-data; name=\"%@\"\r\n\r\n", param] dataUsingEncoding:NSUTF8StringEncoding]];
    [body appendData:[[NSString stringWithFormat:@"%@\r\n", [_params objectForKey:param]] dataUsingEncoding:NSUTF8StringEncoding]];
}

// add image data
NSData *imageData = UIImageJPEGRepresentation(imageToPost, 1.0);
if (imageData) {
    [body appendData:[[NSString stringWithFormat:@"--%@\r\n", BoundaryConstant] dataUsingEncoding:NSUTF8StringEncoding]];
    [body appendData:[[NSString stringWithFormat:@"Content-Disposition: form-data; name=\"%@\"; filename=\"image.jpg\"\r\n", FileParamConstant] dataUsingEncoding:NSUTF8StringEncoding]];
    [body appendData:[[NSString stringWithString:@"Content-Type: image/jpeg\r\n\r\n"] dataUsingEncoding:NSUTF8StringEncoding]];
    [body appendData:imageData];
    [body appendData:[[NSString stringWithFormat:@"\r\n"] dataUsingEncoding:NSUTF8StringEncoding]];
}

[body appendData:[[NSString stringWithFormat:@"--%@--\r\n", BoundaryConstant] dataUsingEncoding:NSUTF8StringEncoding]];

// setting the body of the post to the reqeust
[request setHTTPBody:body];

// set the content-length
NSString *postLength = [NSString stringWithFormat:@"%d", [body length]];
[request setValue:postLength forHTTPHeaderField:@"Content-Length"];

// set URL
[request setURL:requestURL];


但我的意思是我是自学的,如果没有解释,初学者很难理解所以我要的只是一个解释,一个关于整个过程的详细解释,如果有人有困难花时间在这个问题上,因为不管你信不信我发现这是迄今为止最难的话题,因为主要原因是没有关于整个过程的教程,如果有人现在可以一步一步解释这个概念,也没有对初学者的解释明天要学习的学生会更容易。因此,如果有人能详细解释这一点以及上传过程的工作原理和一些参考步骤,我们将不胜感激。

Note : Consider I Have an API and a Key "image" .

我觉得对你有帮助...

- (void)sendImageToServer
{
    UIImage *yourImage= [UIImage imageNamed:@"image.png"];
    NSData *imageData = UIImagePNGRepresentation(yourImage);
    NSString *base64 = [imageData base64EncodedStringWithOptions:NSDataBase64Encoding64CharacterLineLength];
    NSString *strImage = [NSString stringWithFormat:@"data:image/png;base64,%@",base64];

    NSMutableDictionary *dic = [[NSMutableDictionary alloc] initWithObjectsAndKeys:strImage,@"image", nil];
    NSError * err;
    NSData *jsonData = [NSJSONSerialization dataWithJSONObject:dic options:0 error:&err];
    NSString *UserProfileInRequest = [[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding];
    NSData *data=[UserProfileInRequest dataUsingEncoding:NSASCIIStringEncoding allowLossyConversion:YES];
    NSString *len = [NSString stringWithFormat:@"%ld", (unsigned long)[data length]];

    // Init the URLRequest

    NSMutableURLRequest *req = [[NSMutableURLRequest alloc] init];
    [req setURL:[NSURL URLWithString:@"http://YOUR_URL"]];
    [req setHTTPMethod:@"POST"];
    [req setValue:len forHTTPHeaderField:@"Content-Type"];
    [req setValue:@"application/json" forHTTPHeaderField:@"Content-Type"];
    [req setValue:@"application/json" forHTTPHeaderField:@"Accept"];
    [req setValue:@"application/x-www-form-urlencoded" forHTTPHeaderField:@"Content-Type"];
    [req setHTTPBody:data];

    NSURLSession *session = [NSURLSession sharedSession];
    [[session dataTaskWithRequest:req completionHandler:^(NSData *dt, NSURLResponse *response, NSError *err){
        //Response Data
        NSMutableDictionary *dic = [NSJSONSerialization JSONObjectWithData:dt options:kNilOptions error:&err];
        NSLog(@"%@", [dic description]);

    }]resume];
}

这里我们将查看 图片上传 以及一些 ** 参数,因为大多数时候我们上传图片时会附带一些参数,例如 userId。

  • 在深入讨论我们的主题之前,让我提供执行这些操作的代码 source,我们将在下面看到的所有细节都来自其他一些堆栈溢出线程和一些来自其他站点,我会把所有的link都提供给大家参考

    -(void)callApiWithParameters:(NSDictionary *)inputParameter images:(NSArray *)image  imageParamters:(NSArray *)FileParamConstant{
    
    //1
       NSMutableURLRequest *request = [[NSMutableURLRequest alloc] init];
    
       [request setHTTPShouldHandleCookies:NO];
       [request setTimeoutInterval:30];
       [request setHTTPMethod:@"POST"];
    
    //2
       NSString *boundary = @"------CLABoundaryGOKUL";
    
    //3
       NSString *contentType = [NSString stringWithFormat:@"multipart/form-data; boundary=%@", boundary];
       [request setValue:contentType forHTTPHeaderField: @"Content-Type"];
    
    //4
       NSMutableData *body = [NSMutableData data];
    
       for (NSString *key in inputParameter) {
    
       [body appendData:[[NSString stringWithFormat:@"--%@\r\n", boundary] dataUsingEncoding:NSUTF8StringEncoding]];
       [body appendData:[[NSString stringWithFormat:@"Content-Disposition: form-data; name=\"%@\"\r\n\r\n", key] dataUsingEncoding:NSUTF8StringEncoding]];
       [body appendData:[[NSString stringWithFormat:@"%@\r\n", [inputParameter objectForKey:key]] dataUsingEncoding:NSUTF8StringEncoding]];
      }
    
       for (int i = 0; i < image.count; i++) {
    
          NSData *imageDatasss = UIImagePNGRepresentation(image[i]);
    
          if (imageDatasss)
          {
              [body appendData:[[NSString stringWithFormat:@"--%@\r\n", boundary] dataUsingEncoding:NSUTF8StringEncoding]];
              [body appendData:[[NSString stringWithFormat:@"Content-Disposition: form-data; name=\"%@\"; filename=\"image.jpg\"\r\n", FileParamConstant[i]] dataUsingEncoding:NSUTF8StringEncoding]];
              [body appendData:[@"Content-Type:image/jpeg\r\n\r\n" dataUsingEncoding:NSUTF8StringEncoding]];
              [body appendData:imageDatasss];
              [body appendData:[[NSString stringWithFormat:@"\r\n"] dataUsingEncoding:NSUTF8StringEncoding]];
         }
      }
    
      [body appendData:[[NSString stringWithFormat:@"--%@--\r\n", boundary] dataUsingEncoding:NSUTF8StringEncoding]];
    
    //5
      [request setHTTPBody:body];
    
    //6
      [request setURL:[NSURL URLWithString:@"http://changeThisWithYourbaseURL?"]];//Eg:@"http://dev1.com/PTA_dev/webservice/webservice.php?"
    
    //7
      [NSURLConnection sendAsynchronousRequest:request
                                   queue:[NSOperationQueue mainQueue]
                       completionHandler:^(NSURLResponse *response, NSData *data, NSError *error) {
    
                           NSHTTPURLResponse* httpResponse = (NSHTTPURLResponse*)response;
    
                           //8
                           if ([httpResponse statusCode] == 200) {
                               NSDictionary * APIResult =[NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingAllowFragments error:nil];
                               NSLog(@"Response of %@: %@",[inputParameter valueForKey:@"service"],APIResult);
    
                           }else{
                               //9
                               NSLog(@"%@",error.localizedDescription);
                           }
                       }];
    
    
     }
    

    注意: 由于这是一个广泛的主题,我提供了文档 link 以获取详细信息。

    1. 我们正在使用 ** NSMutableURLRequest** 而不是 ** NSURLRequest** 因为我们要将一些数据附加到 it.if 你需要一些深入的澄清可变 url 请求通过此 documentation
      • setHTTPShouldHandleCookies 在这里我们必须决定我们是否要使用 cookie 或 not.To 了解更多 visit
      • setTimeoutInterval 这有助于将时间限制设置为 url request.Add 在给定时间后以秒为单位的时间间隔,请求将被终止。
      • setHTTPMethod还有many methods.But we use GET and POST methods in many cases.Difference between POST and GET is here and here
    2. 边界有助于将参数彼此分开,以便服务器可以识别them.The边界可以是任何您希望随意编辑的东西。
    3. 这里我们使用multipart/form-data; boundary= as content type.To 知道为什么我们要去这个内容类型看看 this thread.
    4. NSMutableData * body 我们将把所有的参数和值附加到这个数据,然后 setHTTPBodyUrlRequest

      • 如果我们这样调用'callApiWithParameters'方法

         - (IBAction)Done:(id)sender{
                NSDictionary * inputParameters = [NSDictionary dictionaryWithObjectsAndKeys:
                              @"1",@"user_id" ,
                              "XXX",@"name" ,
                              nil];
                 NSArray * image = [NSArray arrayWithObjects:[UIImage imageNamed:@"Test"],[UIImage imageNamed:@"Test1"],nil];
                 NSArray * imageParameters = [NSArray arrayWithObjects:@"img_one",@"img_two",nil];
                 [self callApiWithParameters:inputParameters images:image imageParamters:imageParameters];
          }
        
      • 那么数据(即正文)将如下所示

Content-Type=multipart/form-data; boundary=------CLABoundaryGOKUL

--------CLABoundaryGOKUL
Content-Disposition: form-data; name=user_id

1
--------CLABoundaryGOKUL
Content-Disposition: form-data; name=name

XXX
--------CLABoundaryGOKUL
Content-Disposition: form-data; name=img_one; filename=image.jpg

Content-Type:image/jpeg

//First image data appended here

--------CLABoundaryGOKUL
Content-Disposition: form-data; name=img_two; filename=image.jpg

Content-Type:image/jpeg

//Second image data appended here.
  • 上面给出的数据会很清楚的说明是怎么回事,所有的参数和键都已经附加在数据里了Here你可以找到更多关于发送的细节multipart/form。

    1. 现在只需将以上数据添加到[request setHTTPBody:body];
    2. 请求即可
    3. setURL 在此方法中添加您的基础 url 您的应用程序。
    4. 现在我们需要做的就是连接到服务器并发送request.Here我们使用NSURL连接发送请求。关于NS的说明URLConnection 加载 URL 请求的数据,并在请求完成或失败时在操作队列上执行处理程序块。
    5. statusCode 这有助于确定我们是否从服务器成功响应。如果 200 表示正常,500 表示内部服务器错误,等等。更多详细信息 here

    6. 处理else情况下的错误。

仅供参考我已经尽力解释了,请参阅link以更好地理解。

编辑:

只需更改 imageParamater 数组中的名称,为了满足您的要求,将 img_one & img_two 更改为图片.

 - (IBAction)Done:(id)sender{
     //Change input parameters as per your requirement.
     NSDictionary * inputParameters = [NSDictionary dictionaryWithObjectsAndKeys:
                                  @"1",@"user_id" ,
                                  "XXX",@"name" ,
                                  nil];
    NSArray * image = [NSArray arrayWithObjects:[UIImage imageNamed:@"Test"],nil]; //Change Test with your image name
    NSArray * imageParameters = [NSArray arrayWithObjects:@"image",nil];//Added image as a key.
    [self callApiWithParameters:inputParameters images:image imageParamters:imageParameters];
              }

并使用您的示例基础更改点 6 URL,

//6

 [request setURL:[NSURL URLWithString:@"http://google.com/files/upload.php?"]];

将 AFNetworking 用于此任务,这将提供非常简单可靠的解决方案。