CocoaDev

Edit AllPages

This sample code shows how to upload a file from a Cocoa application using HTTP POST. This code is meant to make it as easy as possible to upload files to your own webserver. To use this code you will need to do these things:

Each step will be described in detail below. –SaileshAgrawal


Step 1. The Uploader Class

Add the code below to your application. The uploader class compresses the file before uploading it so you will have to add libz.dylib to your project. You can find libz.dylib in /usr/lib.

@interface Uploader : NSObject { NSURL *serverURL; NSString *filePath; id delegate; SEL doneSelector; SEL errorSelector;

BOOL uploadDidSucceed; }

@end

#import “Uploader.h” #import “zlib.h”

static NSString * const BOUNDRY = @”0xKhTmLbOuNdArY”; static NSString * const FORM_FLE_INPUT = @”uploaded”;

#define ASSERT(x) NSAsert(x, @””) #define Log(x,y)

@interface Uploader (Private)

@end

@implementation Uploader

/* *—————————————————————————– *

/* *—————————————————————————– *

/* *—————————————————————————– *

@end // Uploader

@implementation Uploader (Private)

/* *—————————————————————————– *

/* *—————————————————————————– *

/* *—————————————————————————– *

/* *—————————————————————————– *

/* *—————————————————————————– *

/* *—————————————————————————– *

/* *—————————————————————————– *

-(void) connection:([[NSURLConnection *)connection // IN didReceiveResponse:(NSURLResponse *)response // IN { LOG(6, (“%s: self:0x%p\n”, func, self)); }

/* *—————————————————————————– *

@end

You can now upload a file using the following syntax:

  Uploader alloc] initWithURL:[NSURL [[URLWithString:@"http://my-server.com/uploader.php"
                          filePath:@"/Users/someone/foo.jpg"
                          delegate:self
                      doneSelector:@selector(onUploadDone:)
                     errorSelector:@selector(onUploadError:)];

Step 2. Enable PHP

You need to enable PHP on your webserver. For testing purposes this means your local Macintosh.

If you’re on Tiger edit /etc/httpd/httpd.conf. On Leopard edit /etc/apache2/httpd.conf. For example:

cd /etc/httpd sudo pico httpd.conf

Search for LoadModule php and remove the number sign (#) at the beginning of the line. Next, for Tiger only, search for AddModule php and remove the number sign at the beginning of the line too.

Start your http server by going to System Preferences and enabling Web Sharing in the Sharing pane.


Step 3. Write a PHP web application

The above code uses a HTML form to submit the file. This means that the fields of the form are specific to this web app. If you have a pre-existing web app then search for FORM_FLE_INPUT in the uploader code and change it to match your website.

The following PHP code receives the name of the file in the “uploaded” parameter. If uploading was successful then the file is copied into the upload directory. Save this code as uploader.php and put it on your webserver.

<?php $target = “upload/”; $target = $target . basename( $_FILES[‘uploaded’][‘name’]) ; $ok=1; if(move_uploaded_file($_FILES[‘uploaded’][‘tmp_name’], $target)) { echo “YES”; } else { echo “NO”; } ?>

If you’re having trouble getting your web application to work it may help to test it using a web browser. You can create a web page to upload a file using the following code. Same the code as test.php and put it on your webserver.

Choose a file to upload:

At this point you should be able to upload arbitrary data to your webserer. Note that since the above code compresses the data before transmitting it you will need a small program to decompress it on the server. If compression is not necessary than simple remove the call to the compress method in the above code.


I just used your sample to great success, thankyou very much. However I needed to make a few tweaks to make it compile. The ASSET and LOG functions weren’t working, so I commented them all out, and the #define markings you made for them. I’m not sure why they weren’t but the code would compile and run fine afterwards. You might also want to add a bool flag to the UELUploader initWithURL: method to signal for compression - just for convenience. It is also authentication compatible, just add the name:password to the URL.

Uploader alloc] initWithURL:[NSURL [[URLWithString:@”http://name:password@my-server.com/uploader.php” …


I have been trying to get this to work but am having trouble. Like the previous commenter I had to comment out the ASSET and LOG. I am getting the following response from the server:


Warning: move_uploaded_file(upload/test.bin) [function.move-uploaded-file]: failed to open stream: No such file or directory in subdomain.myserver.com/uploader.php on line 5

Warning: move_uploaded_file() [function.move-uploaded-file]: Unable to move ‘/tmp/phppw6XMF’ to ‘upload/test.bin’ in subdomain.myserver.com/uploader.php on line 5

Also when I run the web browser one I get the same thing:

Warning: move_uploaded_file(upload/testfile.txt) [function.move-uploaded-file]: failed to open stream: No such file or directory in subdomain.myserver.com/uploader.php on line 5

Warning: move_uploaded_file() [function.move-uploaded-file]: Unable to move ‘/tmp/php7UoHOZ’ to ‘upload/testfile.txt’ in subdomain.myserver/uploader.php on line 5 NO

All I did is copy and past the code. Would love to have some help.


I figured it out! the “upload” folder was spelled “uploads” Stupid mistake but maybe my waisted time will help someone else save some time. Pour vous joindre maintenir votre numéro, vous aurez peuvent avoir comptes propriétaire (code RIO ) [http://obtenir-rio.info rio bouygues]. Vous obtiendrez est certain d’obtenir gratuitement pour aucun coût par appelant mots du serveur ou du service à la clientèle clientèle du entreprise [http://obtenir-rio.info/rio-bouygues rio bouygues] . Vous ne CAN acquérir un SMS avec vos . Avec du [http://obtenir-rio.info/rio-orange rio orange], alors vous êtes capable d’ sur le offre de de son ON orange orange .