0

私はクライアントサーバーアプリを開発しています。1つの画像をアップロードする方法のチュートリアルがいくつか見つかりました。しかし、単一のリクエストを使用して複数の画像をアップロードするための最良の方法は何ですか?私はWebプログラミングに慣れていないので、一般的な方法はありません。

助けていただければ幸いです。

4

2 に答える 2

1

ASIHTTPRequestライブラリを使用する必要があります。

次に、独自のクラスを作成して、必要なすべてのリクエストを管理します。これは私のものです:

#import "ASIFormDataRequest.h"

@interface PostRequest : NSObject {
    id localCopy; // to avoid exec_bad_access with arc
    ASIHTTPRequest *getRequest;
    ASIFormDataRequest *postRequest;
}

@property (nonatomic, retain) id delegate;
@property (nonatomic, readwrite) SEL callback;
@property (nonatomic, readwrite) SEL errorCallback;

- (void)performGetRequestWithString:(NSString *)string stringDictionary:(NSDictionary *)stringDictionary delegate:(id)requestDelegate requestSelector:(SEL)requestSelector errorSelector:(SEL)errorSelector;
- (void)performPostRequestWithString:(NSString *)string stringDictionary:(NSDictionary *)stringDictionary dataDictionary:(NSDictionary *)dataDictionary delegate:(id)requestDelegate requestSelector:(SEL)requestSelector errorSelector:(SEL)errorSelector;

@end

//

#import "PostRequest.h"

@implementation PostRequest

@synthesize delegate;
@synthesize callback, errorCallback;

- (void)performGetRequestWithString:(NSString *)string stringDictionary:(NSDictionary *)stringDictionary delegate:(id)requestDelegate requestSelector:(SEL)requestSelector errorSelector:(SEL)errorSelector {

    localCopy = self;

    self.delegate = requestDelegate;
    self.callback = requestSelector;
    self.errorCallback = errorSelector;

    NSMutableString *requestStringData = [[NSMutableString alloc] init];
    if (stringDictionary)
        for (NSString *key in [stringDictionary allKeys])
            [requestStringData appendFormat:@"%@=%@&", key, [stringDictionary objectForKey:key]];
    NSString *resultString = [requestStringData substringToIndex:[requestStringData length]-1];

    getRequest = [[ASIFormDataRequest alloc] initWithURL:[NSURL URLWithString:[NSString stringWithFormat:@"%@?%@", string, [resultString stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]]]];
    [getRequest setDelegate:self];
    [getRequest setRequestMethod:@"GET"];

    //NSLog(@"request url = %@", [getRequest.url absoluteString]);
    [getRequest startAsynchronous];
}

- (void)performPostRequestWithString:(NSString *)string stringDictionary:(NSDictionary *)stringDictionary dataDictionary:(NSDictionary *)dataDictionary delegate:(id)requestDelegate requestSelector:(SEL)requestSelector errorSelector:(SEL)errorSelector {

    localCopy = self;

    self.delegate = requestDelegate;
    self.callback = requestSelector;
    self.errorCallback = errorSelector;

    NSURL *url = [NSURL URLWithString:string];

    postRequest = [[ASIFormDataRequest alloc] initWithURL:url];
    [postRequest setDelegate:self];
    [postRequest setRequestMethod:@"POST"];

    if (stringDictionary)
        for (NSString *key in [stringDictionary allKeys])
            [postRequest setPostValue:[stringDictionary objectForKey:key] forKey:key];

    if (dataDictionary)
        for (NSString *key in [dataDictionary allKeys])
            [postRequest setData:[dataDictionary objectForKey:key] forKey:key];

    //NSLog(@"request url = %@", [postRequest.url absoluteString]);
    [postRequest startAsynchronous];
}

#pragma mark - ASIHTTPRequest Delegate Implementation

- (void)requestFinished:(ASIHTTPRequest *)crequest {
    NSString *status = [crequest responseString];

    if (self.delegate && self.callback) {
        if([self.delegate respondsToSelector:self.callback])
            [self.delegate performSelectorOnMainThread:self.callback withObject:status waitUntilDone:YES];
        else
            NSLog(@"No response from delegate");
    }
    localCopy = nil;
}
- (void)requestFailed:(ASIHTTPRequest *)crequest {
    if (self.delegate && self.errorCallback) {
        if([self.delegate respondsToSelector:self.errorCallback])
            [self.delegate performSelectorOnMainThread:self.errorCallback withObject:crequest.error waitUntilDone:YES];
        else
            NSLog(@"No response from delegate");
    }
    localCopy = nil;
}

@end

それを使用するには、をインポートPostRequest.hしてUIViewController、次のように実行します。

[requestManager performGetRequestWithString:tempString stringDictionary:stringDictionary dataDictionary:dataDictionary delegate:self requestSelector:@selector(requestSucceeded:) errorSelector:@selector(requestFailed:)];

パラメーター:

  • (NSString *)string--url文字列。リクエストを投稿する場所。
  • (NSDictionary *)stringDictionary-すべてのテキスト情報(名前、IDなど)を含む辞書。
  • (NSDictionary *)dataDictionary-すべてのデータ情報(写真、ファイルなど)を含む辞書。
  • (id)requestDelegate-以下のセレクターを実行するように委任します。
  • (SEL)requestSelector-セレクター。リクエストが成功すると実行されます。
  • (SEL)errorSelector-セレクター。エラーが発生したときに実行されます。
于 2012-04-19T11:47:16.377 に答える
1

ASIHTTPRequestまたはAFNetworkingのいずれかを使用することをお勧めします

どちらにも、使用できるネットワークキューがあります。ASIHTTPはもう開発されていないので、開発中のライブラリを使用したい場合は、AFNetworkingを調べることができます...

于 2012-04-19T11:42:05.280 に答える