How to post more parameters with image upload code in iOS?

前端 未结 2 2012
别那么骄傲
别那么骄傲 2020-11-28 14:49

Hi I am uploading image on php server and successfully uploaded with the help of this code

- (NSString*)uploadData:(NSData *)data toURL:(NSString *)urlStr:(N         


        
相关标签:
2条回答
  • 2020-11-28 15:30

    If you haven't thought about using AFNetworking, you should. It makes dealing with web-services much easier. I have done something similar to what I think you are wanting to do. I wrote a custom class to fire off network requests. Here ya go: NetworkClient.h

    /*
     NetworkClient.h
    
     Created by LJ Wilson on 2/3/12.
     Copyright (c) 2012 LJ Wilson. All rights reserved.
     License:
    
     Permission is hereby granted, free of charge, to any person obtaining a copy of this software 
     and associated documentation files (the "Software"), to deal in the Software without restriction, 
     including without limitation the rights to use, copy, modify, merge, publish, distribute, 
     sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is 
     furnished to do so, subject to the following conditions:
    
     The above copyright notice and this permission notice shall be included in all copies or 
     substantial portions of the Software.
    
     THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT 
     NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 
     NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, 
     DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT 
     OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
     */
    
    #import <Foundation/Foundation.h>
    
    extern NSString * const APIKey;
    
    @interface NetworkClient : NSObject
    
    +(void)processURLRequestWithURL:(NSString *)url 
                          andParams:(NSDictionary *)params 
                              block:(void (^)(id obj))block;
    
    +(void)processURLRequestWithURL:(NSString *)url 
                          andParams:(NSDictionary *)params 
                        syncRequest:(BOOL)syncRequest
                              block:(void (^)(id obj))block;
    
    +(void)processURLRequestWithURL:(NSString *)url 
                          andParams:(NSDictionary *)params 
                        syncRequest:(BOOL)syncRequest
                 alertUserOnFailure:(BOOL)alertUserOnFailure
                              block:(void (^)(id obj))block;
    
    +(void)processFileUploadRequestWithURL:(NSString *)url 
                                 andParams:(NSDictionary *)params 
                                  fileData:(NSData *)fileData 
                                  fileName:(NSString *)fileName
                                  mimeType:(NSString *)mimeType 
                                     block:(void (^)(id obj))block;
    
    +(void)handleNetworkErrorWithError:(NSError *)error;
    
    +(void)handleNoAccessWithReason:(NSString *)reason;
    
    @end
    

    NetworkClient.m

    /*
     NetworkClient.m
    
     Created by LJ Wilson on 2/3/12.
     Copyright (c) 2012 LJ Wilson. All rights reserved.
     License:
    
     Permission is hereby granted, free of charge, to any person obtaining a copy of this software 
     and associated documentation files (the "Software"), to deal in the Software without restriction, 
     including without limitation the rights to use, copy, modify, merge, publish, distribute, 
     sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is 
     furnished to do so, subject to the following conditions:
    
     The above copyright notice and this permission notice shall be included in all copies or 
     substantial portions of the Software.
    
     THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT 
     NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 
     NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, 
     DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT 
     OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
     */
    
    #import "NetworkClient.h"
    #import "AFHTTPClient.h"
    #import "AFHTTPRequestOperation.h"
    #import "SBJson.h"
    
    NSString * const APIKey = @"APIKEY GOES HERE IF YOU WANT TO USE ONE";
    
    @implementation NetworkClient
    
    +(void)processURLRequestWithURL:(NSString *)url 
                          andParams:(NSDictionary *)params 
                              block:(void (^)(id obj))block {
    
        [self processURLRequestWithURL:url andParams:params syncRequest:NO alertUserOnFailure:NO block:^(id obj) {
            block(obj);
        }];
    }
    
    +(void)processURLRequestWithURL:(NSString *)url 
                          andParams:(NSDictionary *)params 
                        syncRequest:(BOOL)syncRequest
                              block:(void (^)(id obj))block {
        [self processURLRequestWithURL:url andParams:params syncRequest:syncRequest alertUserOnFailure:NO block:^(id obj) {
            block(obj);
        }];
    }
    
    
    +(void)processURLRequestWithURL:(NSString *)url 
                          andParams:(NSDictionary *)params 
                        syncRequest:(BOOL)syncRequest
                 alertUserOnFailure:(BOOL)alertUserOnFailure
                              block:(void (^)(id obj))block {
    
        // Default url goes here, pass in a nil to use it
        if (url == nil) {
            url = @"http://www.mydomain.com/mywebservice";
        }
    
        NSMutableDictionary *dict = [[NSMutableDictionary alloc] initWithDictionary:params];
        [dict setValue:APIKey forKey:@"APIKey"];
    
        NSDictionary *newParams = [[NSDictionary alloc] initWithDictionary:dict];
    
        NSURL *requestURL;
        AFHTTPClient *httpClient = [[AFHTTPClient alloc] initWithBaseURL:requestURL];
    
        NSMutableURLRequest *theRequest = [httpClient requestWithMethod:@"POST" path:url parameters:newParams];
    
        __block NSString *responseString = [NSString stringWithString:@""];
    
        AFHTTPRequestOperation *_operation = [[AFHTTPRequestOperation alloc] initWithRequest:theRequest];
        __weak AFHTTPRequestOperation *operation = _operation;
    
        [operation  setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject) {
            responseString = [operation responseString];
    
            id retObj = [responseString JSONValue];
    
            // Check for invalid response (No Access)
            if ([retObj isKindOfClass:[NSDictionary class]]) {
                if ([[(NSDictionary *)retObj valueForKey:@"Message"] isEqualToString:@"No Access"]) {
                    block(nil);
                    [self handleNoAccessWithReason:[(NSDictionary *)retObj valueForKey:@"Reason"]];
                }
            } else if ([retObj isKindOfClass:[NSArray class]]) {
                if ([(NSArray *)retObj count] > 0) {
                    NSDictionary *dict = [(NSArray *)retObj objectAtIndex:0];
                    if ([[dict valueForKey:@"Message"] isEqualToString:@"No Access"]) {
                        block(nil);
                        [self handleNoAccessWithReason:[(NSDictionary *)retObj valueForKey:@"Reason"]];
                    }
                }
            }
            block(retObj);
        } 
                                          failure:^(AFHTTPRequestOperation *operation, NSError *error) {
                                              NSLog(@"Failed with error = %@", [NSString stringWithFormat:@"[Error]:%@",error]);
                                              block(nil);
                                              if (alertUserOnFailure) {
                                                  // Let the user know something went wrong
                                                  [self handleNetworkErrorWithError:operation.error];
                                              }
    
                                          }];
    
        [operation start];
    
        if (syncRequest) {
            // Process the request syncronously
            [operation waitUntilFinished];
        } 
    
    
    }
    
    
    #pragma mark - processFileUpload
    +(void)processFileUploadRequestWithURL:(NSString *)url 
                                 andParams:(NSDictionary *)params 
                                  fileData:(NSData *)fileData 
                                  fileName:(NSString *)fileName
                                  mimeType:(NSString *)mimeType 
                                     block:(void (^)(id obj))block {
    
        // Default url goes here, pass in a nil to use it
        if (url == nil) {
            url = @"http://www.mydomain.com/mywebservice";
        }
    
        NSMutableDictionary *dict = [[NSMutableDictionary alloc] initWithDictionary:params];
        [dict setValue:APIKey forKey:@"APIKey"];
    
        NSDictionary *newParams = [[NSDictionary alloc] initWithDictionary:dict];
        AFHTTPClient *client= [AFHTTPClient clientWithBaseURL:[NSURL URLWithString:url]];  
    
        NSMutableURLRequest *myRequest = [client multipartFormRequestWithMethod:@"POST" 
                                                                           path:@"" 
                                                                     parameters:newParams 
                                                      constructingBodyWithBlock: ^(id <AFMultipartFormData>formData) {
            [formData appendPartWithFileData:fileData name:fileName fileName:fileName mimeType:mimeType];
        }];
    
    
        AFHTTPRequestOperation *_operation = [[AFHTTPRequestOperation alloc] initWithRequest:myRequest];
        __weak AFHTTPRequestOperation *operation = _operation;
        __block NSString *responseString = [NSString stringWithString:@""];
    
        [operation  setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject) {
            responseString = [operation responseString];
    
            id retObj = [responseString JSONValue];
    
            // Check for invalid response (No Access)
            if ([retObj isKindOfClass:[NSDictionary class]]) {
                if ([[(NSDictionary *)retObj valueForKey:@"Message"] isEqualToString:@"No Access"]) {
                    block(nil);
                    [self handleNoAccessWithReason:[(NSDictionary *)retObj valueForKey:@"Reason"]];
                }
            } else if ([retObj isKindOfClass:[NSArray class]]) {
                if ([(NSArray *)retObj count] > 0) {
                    NSDictionary *dict = [(NSArray *)retObj objectAtIndex:0];
                    if ([[dict valueForKey:@"Message"] isEqualToString:@"No Access"]) {
                        block(nil);
                        [self handleNoAccessWithReason:[(NSDictionary *)retObj valueForKey:@"Reason"]];
                    }
                }
            }
            block(retObj);
    
    
        } 
                                          failure:^(AFHTTPRequestOperation *operation, NSError *error) {
                                              NSLog(@"Failed with error = %@", [NSString stringWithFormat:@"[Error]:%@",error]);
                                              block(nil);
    //                                          if (alertUserOnFailure) {
    //                                              // Let the user know something went wrong
    //                                              [self handleNetworkErrorWithError:operation.error];
    //                                          }
    
                                          }];
    
        [operation start];
    
    
    }
    
    
    #pragma mark - Error and Access Handling
    +(void)handleNetworkErrorWithError:(NSError *)error {
        NSString *errorString = [NSString stringWithFormat:@"[Error]:%@",error];
    
        // Standard UIAlert Syntax
        UIAlertView *myAlert = [[UIAlertView alloc] 
                                initWithTitle:@"Connection Error" 
                                message:errorString 
                                delegate:nil 
                                cancelButtonTitle:@"OK" 
                                otherButtonTitles:nil, nil];
    
        [myAlert show];
    
    }
    
    +(void)handleNoAccessWithReason:(NSString *)reason {
        // Standard UIAlert Syntax
        UIAlertView *myAlert = [[UIAlertView alloc] 
                                initWithTitle:@"No Access" 
                                message:reason 
                                delegate:nil 
                                cancelButtonTitle:@"OK" 
                                otherButtonTitles:nil, nil];
    
        [myAlert show];
    
    }
    
    
    @end
    

    Some of this is specific to what I do. All my web services use an APIKey to enhance security and they all do security checks before processing any requests. The network client will return either an NSDictionary or an NSArray depending on what the web service returns (in JSON).

    To use the image upload, you would call this in your VC like this (use as many parameters as you need.:

    NSData *imageData = UIImagePNGRepresentation(myImage);
    NSString *fileName = @"MyFileName.png";
    
    NSDictionary *params = [NSDictionary dictionaryWithObjectsAndKeys:
                                @"Param1", @"Param1Name",
                                @"Param2", @"Param2Name",
                                @"Param3", @"Param3Name", 
                                nil];
    // Uses default URL    
    [NetworkClient processFileUploadRequestWithURL:nil 
                                         andParams:params 
                                          fileData:imageData 
                                          fileName:fileName
                                          mimeType:@"image/png" 
                                                 block:^(id obj) {
        if ([obj isKindOfClass:[NSArray class]]) {
            // Successful upload, do other processing as needed
        }
    }];
    

    Feel free to strip out what you don't need. Just leave the copyright notice in place.

    0 讨论(0)
  • 2020-11-28 15:35

    You may try this:

        [body appendData:[[NSString stringWithFormat:@"\r\n--%@\r\n",stringBoundary] dataUsingEncoding:NSUTF8StringEncoding]];  
        [body appendData:[[NSString stringWithFormat:@"Content-Disposition: form-data; name=\"%@\"\r\n\r\n",@"userId"] dataUsingEncoding:NSUTF8StringEncoding]];
        [body appendData:[[NSString stringWithFormat:@"%@",_userID] dataUsingEncoding:NSUTF8StringEncoding]];
    
    0 讨论(0)
提交回复
热议问题