ASIFormDataRequest + PHP问题

时间:2010-12-06 00:48:22

标签: php objective-c cocoa file-upload

我正在尝试使用ASIFormDataRequest将文件上传到服务器(来自自定义mac os应用程序)。在我的cocoa / obj-c代码中,我有:

- (IBAction)uploadFile:(id)sender 
{ 
 [networkQueue reset];
 [networkQueue setShowAccurateProgress:YES];
 [networkQueue setUploadProgressDelegate:progressIndicator];
 [networkQueue setRequestDidFailSelector:@selector(postFailed:)];
 [networkQueue setRequestDidFinishSelector:@selector(postFinished:)];
 [networkQueue setDelegate:self];

 ASIFormDataRequest *request = [[[ASIFormDataRequest alloc] initWithURL:[NSURL URLWithString:@"http://domain.com/to/upload.php"]] autorelease];

 [request setFile:@"/path/to/file.jpg" forKey:@"file"];

 [networkQueue addOperation:request];
 [networkQueue go];

}

- (void)postFinished:(ASIHTTPRequest *)request
{
 NSLog(@"Post Success");
}
- (void)postFailed:(ASIHTTPRequest *)request
{
 NSLog(@"Post Failed");
}

服务器上的PHP代码如下所示:

$target_path = "files/";

$target_path = $target_path . basename( $_FILES['uploadedfile']['name']); 

if(move_uploaded_file($_FILES['uploadedfile']['tmp_name'], $target_path)) {
  echo "The file ".  basename( $_FILES['uploadedfile']['name']). 
    " has been uploaded";
 } else{
  echo "There was an error uploading the file, please try again!";
 }

当我尝试使用此代码上传文件时,我在客户端获得“Post Success”响应,但该文件从未显示在我的服务器上。我已经将文件夹CHMODed到777以防万一,但它似乎仍然无法正常工作。有没有人有建议,或者看到我接近这个错误的方式出错?

谢谢!

2 个答案:

答案 0 :(得分:4)

未来读者的更新 。这里的根本问题是你必须完全像这样创建ASIFormDataRequest项:

NSURL *url = [NSURL URLWithString:@"https://www.you.com/cgi-bin/you.cgi?stuff"];
ASIFormDataRequest *request = [ASIFormDataRequest requestWithURL:url];

不要 添加更多版本,保留,自动释放,自我等等!就是这样。

嗯。我不完全确定自动释放是否正确。你必须小心不要在ASIHttpRequest中丢失resuest指针。

除此之外,首先要将它作为一个简单的(非排队的,异步的)请求进行尝试,使用这种已被测试数十亿次的模式:

-(void) sendSomethingAnything
    {
    NSURL *url = [NSURL URLWithString:@"https://www.you.com/cgi-bin/you.cgi?stuff"];
    ASIFormDataRequest *request = [ASIFormDataRequest requestWithURL:url];

    [request setPostValue:@"fakeIDstring" forKey:@"id"];
    [request setPostValue:@"anotherCalue" forKey:@"username"];
    // your file here ..

    [request setDelegate:self];
    [request setDidFinishSelector:@selector(postFinished:)];
    [request setDidFailSelector:@selector(postFailed:)];

    [request startAsynchronous];
    }

只需粘贴您的网址即可立即尝试。这将消除许多问题,让我们更接近问题。在完成例程中,获取并显示结果......

NSData *newStringData = [request responseData];
NSString *x = [[[NSString alloc] initWithData:newStringData
                  encoding:NSUTF8StringEncoding] autorelease];
NSLog(@"result text from server is %@", x);

最后在你的PHP中。我发现从PHP中添加一行EMAILS ME的代码是有用的,说明发生了什么。或者,使用“wall”命令,并在使用客户端时在服务器上打开shell。这是看到工作中发生了什么的唯一方法。

(事实上我使用老式的perl而不是未来的php,所以我不能在这方面提供任何代码!:))

答案 1 :(得分:0)

我做了这个并且它有效。确保这样做 - > #import“ASIFormDataRequest.h”

  

NSURL * url = [NSURL   URLWithString:@ “XXXXXX”];       ASIFormDataRequest * request = [ASIFormDataRequest   requestWithURL:URL];

[request setPostValue:@"fakeIDstring" forKey:@"id"];
[request setPostValue:@"anotherCalue" forKey:@"username"];
// your file here ..  
[request setFile:@"path/filename.png" forKey:@"uploadedfile"];

[request setDelegate:self];
[request setDidFinishSelector:@selector(requestDone:)];
[request setDidFailSelector:@selector(requestWentWrong:)];

[request startAsynchronous];

然后在PHP代码中

  

$ target_path =“files /”;

     

$ target_path = $ target_path。   基本名(   $ _FILES [ 'UploadedFile的'] [ '名称']);

     

如果(move_uploaded_file($ _ FILES [ 'UploadedFile的'] [ 'tmp_name的值'],   $ target_path)){echo“文件”。   基本名(   $ _FILES [ 'UploadedFile的'] [ '名'])。       “已上传”; } else {echo“上传时出错   文件,请再试一次!“;}

请注意,您应该在php文件旁边有“files”文件夹来处理这个上传的文件。