0

ASIHTTPRequest フレームワークを使用して、iPhone 経由で Web サーバーにファイルをアップロードしようとしています。以下はコードです。setFile メソッドを使用しない限り、サーバーから 200 が返されるので、すべて問題ありません。setFile を実装するとすぐに、サーバーは 0 を返します。認証の問題に対処していると想像できるので、401 などを期待します。私のサーバーは IIS です。リクエストで NTLM 方式を使用するのはなぜですか。私は何かが恋しいですか?

NSInteger httpStatus;
NSString *httpResponseString;
NSError *httpRequestError;

NSArray *paths = [[[NSArray alloc] init] autorelease];
paths =  NSSearchPathForDirectoriesInDomains(NSDocumentDirectory , NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
NSString *filename = [documentsDirectory stringByAppendingPathComponent:@"abiliator_basis_de_ar.xml"];


NSURL *myURL = [NSURL URLWithString: @"http://my.url.com/"]; 
ASIFormDataRequest *request = [ASIFormDataRequest requestWithURL:myURL];
[request setShouldPresentCredentialsBeforeChallenge:NO];
[request setUsername:@"myUserName"];
[request setPassword:@"myPassword"];
[request setDomain:@"myDomainName"];
[request setFile:[NSURL URLWithString:filename] forKey:@"xml"];
[request startSynchronous];
httpRequestError = [request error];
httpResponseString = [request responseString];
httpStatus = [request responseStatusCode];
if (!httpRequestError) {
    httpStatus = [request responseStatusCode];
    NSLog(@"Class %@, Method: %@ - OK login and filetransfer successful '%i'", self.myClassName, NSStringFromSelector(_cmd), httpStatus);
} 
else {            
    NSLog(@"Class %@, Method: %@ - Error '%i' occurred sending the http request", self.myClassName, NSStringFromSelector(_cmd), httpStatus);
}

はい、ファイルが存在します。これが ls の結果です。

rene-stegs-macbook-pro:~ renesteg$ ls -ltr '/Users/renesteg/Library/Application Support/iPhone Simulator/5.1/Applications/417BD791-64BC-48D0-B519-F10C7F617E36/Documents/abiliator_basis_de_ar.xml'
-rw-r--r--@ 1 renesteg  staff  1062 22 Mai 13:44 /Users/renesteg/Library/Application Support/iPhone Simulator/5.1/Applications/417BD791-64BC-48D0-B519-F10C7F617E36/Documents/abiliator_basis_de_ar.xml

そして、ここでファイル名の値:

Filename string is: '/Users/renesteg/Library/Application Support/iPhone Simulator/5.1/Applications/417BD791-64BC-48D0-B519-F10C7F617E36/Documents/abiliator_basis_de_ar.xml
4

4 に答える 4

1

ファイルのアップロード中に何か間違ったことをしています。

これを好きになる必要がある

NSFileManager *fileManager = [NSFileManager defaultManager];

    request = [[[ASIFormDataRequest alloc] initWithURL:url] autorelease];
    [request setRequestMethod:@"POST"];
    [request setTimeOutSeconds:120];

    [request setPostFormat:ASIMultipartFormDataPostFormat];
    [request addRequestHeader:@"Content-Type" value:@"multipart/form-data"];  
    if ([fileManager fileExistsAtPath:filePath] == YES) {

        [request setFile:filePath withFileName:@"test.xml" andContentType:@"xml" forKey:@"FieldName"];
    }

ここで、fromdata リクエスト用にファイル パスを設定する必要があります。

これがうまくいくことを願っています。

于 2012-06-01T10:16:14.320 に答える
0

次を使用する必要があるため、エラーが発生すると思います:

[request setFile:[NSURL fileURLWithPath:filename] forKey:@"xml"];
于 2012-06-01T11:23:36.273 に答える
0

OK、問題は Neels コメントの行の間にありました: PHP がありません。もちろん、これは URL で呼び出す必要があるため、URL を作成する正しい方法は次のとおりです。

NSURL *myURL = [NSURL URLWithString: @"http://my.url.com/upload.php"]; 

このようにして、iPhone の httpRequest コードと PHP のマッピングを取得しました。

必要な PHP コードは次のとおりです。

     <?php 
 $target = "upload/"; 
 $target = $target . basename( $_FILES['xml']['name']) ; 
 $ok=1; 
 if(move_uploaded_file($_FILES['xml']['tmp_name'], $target)) 
 {
    echo "The file ". basename( $_FILES['xml']['name']). " has been uploaded";
 } 
 else {
    echo "Error uploading". basename( $_FILES['xml']['name']). " occured";
 }
 ?> 
于 2012-06-01T12:21:46.280 に答える
0

setData:forKey: を使用して、xml ファイルのデータを送信する必要があります。以下の例を参照してください。

.....
NSURL *myURL = [NSURL URLWithString: @"http://my.url.com/"]; 
ASIFormDataRequest *request = [ASIFormDataRequest requestWithURL:myURL];
[request setShouldPresentCredentialsBeforeChallenge:NO];
[request setUsername:@"myUserName"];
[request setPassword:@"myPassword"];
[request setDomain:@"myDomainName"];
[request setData:[NSData dataWithContentsOfFile:fileName] forKey:@"xml"];
[request startSynchronous];
.....

また、おそらくこれをasynchronousリクエストする必要があります。

于 2012-06-01T10:33:55.137 に答える