2010-12-06 19 views
0

J'essaye de télécharger un fichier sur un serveur (à partir d'une application mac OS personnalisée) en utilisant ASIFormDataRequest. Dans mon code cacao/obj-c, je:ASIFormDataRequest + Problèmes PHP

- (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"); 
} 

Le code PHP sur le serveur ressemble à ceci:

$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!"; 
} 

Lorsque je tente de télécharger un fichier en utilisant ce code, je reçois un Réponse "Post succès" à la fin du client, mais le fichier n'apparaît jamais sur mon serveur. J'ai CHMODed le dossier de fichiers à 777 juste au cas où, mais il ne semblait toujours pas fonctionner. Est-ce que quelqu'un a une suggestion, ou voit-il une erreur dans la façon dont j'aborde cela?

Merci!

Répondre

4

Mise à jour pour les futurs lecteurs. Le problème fondamental est que vous devez créer des éléments ASIFormDataRequest exactement comme ceci:

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

Ne pas ajouter en version plus, retiendrez, autorelease, auto, etc etc.! C'est tout.

Hmm. Je ne suis pas entièrement sûr que l'autorelease est correcte. Vous devez faire attention à ne pas perdre les pointeurs les plus recherchés dans ASIHttpRequest.

Réglage qui part, serait-il la peine d'essayer d'abord comme un simple (non-file d'attente, asynchrone) demande, en utilisant exactement ce modèle qui a été testé des milliards de fois:

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

Il suffit de coller dans votre URL et vous pouvez essayer cela immédiatement. Cela éliminera beaucoup de problèmes et nous rapprochera du problème. Dans la routine faite, obtenir et montrer le résultat comme ceci ...

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

Enfin dans votre PHP. Je trouve utile d'ajouter une ligne de code qui m'ENVOYE du php indiquant ce qui se passe. Alternativement, utilisez une commande "wall", et juste un shell ouvert sur votre serveur lorsque vous travaillez avec le client. C'est la seule façon de voir ce qui se passe pendant que vous travaillez.

(En fait, j'utilise l'ancienne perl plutôt que php futuriste, donc je ne peux pas offrir de code à cette fin :)!)

+0

+1 pour supprimer l'allocation étrangère + init + autorelease dans la création de la demande. J'ai eu un succès parfait en téléchargeant des fichiers sur une page php avec un code comme celui de Joe. –

+0

Cheers, travaillé comme un charme. Merci! – minimalpop

0

Je l'ai fait et il works.Make sûr de le faire - > #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]; 

puis dans le code php

TARGET_PATH de $ = "fichiers /";

$ target_path = $ chemin_cible. basename ( $ _FILES ['uploadedfile'] ['nom']); If (move_uploaded_file ($ _FICHES ['uploadedfile'] ['tmp_name'], $ chemin_cible)) {echo "Le fichier". basename ( $ _FILES ['uploadedfile'] ['nom']). "a été téléchargé"; } else {echo "Une erreur s'est produite lors du chargement du fichier , veuillez réessayer!"; }

Notez que vous devez avoir le dossier "files" à côté de votre fichier php qui gère ce fichier téléchargé.