ASIFormDataRequest + PHP Проблемы - PullRequest
       2

ASIFormDataRequest + PHP Проблемы

0 голосов
/ 06 декабря 2010

Я пытаюсь загрузить файл на сервер (из пользовательского приложения Mac OS) с помощью ASIFormDataRequest.В моем коде какао / 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 ]

4 голосов
/ 06 декабря 2010

Обновление для будущих читателей .Основная проблема заключалась в том, что вы должны создавать элементы ASIFormDataRequest точно так же, как это:

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

Не добавлять дополнительные версии, сохранять, автоматически освобождать себя,и т. д.Вот и все.

Хмм.Я не совсем уверен, что авто-релиз там правильный.Вы должны быть осторожны, чтобы не потерять указатели восстановления в ASIHttpRequest.

Если оставить это в стороне, стоило бы сначала попробовать его как простой (без очереди, асинхронный) запрос, используя именно этот шаблон, который был протестированмиллиарды раз:

-(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];
    }

Просто вставьте свой URL, и вы можете попробовать это немедленно.Это устранит множество проблем и приблизит нас к этой проблеме.В готовой процедуре получите и покажите результат следующим образом ...

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

Наконец, в вашем PHP.Я считаю полезным добавить строку кода, которая отправляет мне по электронной почте из php, с указанием, что происходит, черт возьми.В качестве альтернативы, используйте команду «wall» и просто откройте оболочку на вашем сервере, когда вы работаете с клиентом.Это единственный способ увидеть, что, черт возьми, происходит во время вашей работы.

(На самом деле я использую старомодный Perl, а не футуристический PHP, поэтому я не могу предложить никакого кода на этот счет! :))

0 голосов
/ 08 декабря 2010

Я сделал это, и это работает. Обязательно сделайте это -> #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'] ['name']);

if (move_uploaded_file ($ _ FILES ['uploadedfile'] ['tmp_name'], $ target_path)) {echo "Файл".базовое имя ($ _FILES ['uploadedfile'] ['name'])."был загружен";} else {echo "Произошла ошибка при загрузке файла, пожалуйста, попробуйте еще раз!";}

Обратите внимание, что у вас должна быть папка "files" рядом с вашим php-файлом, который обрабатывает этот загруженный файл.

...