• Open Menu Close Menu
  • Apple
  • Shopping Bag
  • Apple
  • Mac
  • iPad
  • iPhone
  • Watch
  • TV
  • Music
  • Support
  • Search apple.com
  • Shopping Bag

Lists

Open Menu Close Menu
  • Terms and Conditions
  • Lists hosted on this site
  • Email the Postmaster
  • Tips for posting to public mailing lists
Re: File upload with NSURLRequest fails
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: File upload with NSURLRequest fails


  • Subject: Re: File upload with NSURLRequest fails
  • From: Ben Lachman <email@hidden>
  • Date: Fri, 14 Mar 2008 02:43:32 -0400

I do this with a perl script on the back end. My experience was that its was more cajoling the perl script into working that the PHP side, but that may be because I'm not much of a perl wizard (maybe only level 8 or so :-). I found it was important to declare a filename if you're transferring data like this.

Here is my code:

NSMutableURLRequest *postRequest = [NSMutableURLRequest requestWithURL:aURL cachePolicy:NSURLRequestReloadIgnoringCacheData timeoutInterval:30.0];

NSString *boundary = @"----Boundary+AaB03x";

[postRequest setHTTPMethod:@"POST"];
[postRequest addValue:[aURL] absoluteString] forHTTPHeaderField:@"Referer"];
[postRequest setValue:[NSString stringWithFormat:@"multipart/form- data; boundary=%@", boundary, nil] forHTTPHeaderField:@"Content-Type"];


NSEnumerator *dictionaryEnumerator = [postDictionary keyEnumerator];
NSString *currentKey = nil;

NSMutableData *multipartData = [NSMutableData data];

while( (currentKey = [dictionaryEnumerator nextObject]) ) {
[multipartData appendData:[[NSString stringWithFormat:@"\r\n--%@\r \n", boundary] dataUsingEncoding:NSASCIIStringEncoding allowLossyConversion:NO]];

id currentValue = [postDictionary objectForKey:currentKey];

if( [currentValue isKindOfClass:[NSData class]] && [NSImageRep imageRepClassForData:currentValue] != nil ) {
[multipartData appendData:[[NSString stringWithFormat:@"Content- Disposition: form-data; name=\"%@\"; filename=\"image.jp2\"\r\n", currentKey] dataUsingEncoding:NSASCIIStringEncoding]];

[multipartData appendData:[@"Content-Type: image/jp2\r\n" dataUsingEncoding:NSASCIIStringEncoding]];
[multipartData appendData:[@"Content-Transfer-Encoding: binary\r\n\r \n" dataUsingEncoding:NSASCIIStringEncoding]];

[multipartData appendData:currentValue];
}
}


[multipartData appendData:[[NSString stringWithFormat:@"\r\n--%@--\r \n", boundary] dataUsingEncoding:NSASCIIStringEncoding allowLossyConversion:NO]];

[postRequest setHTTPBody:multipartData];

Hope this helps,

->Ben

--
Ben Lachman
Acacia Tree Software

http://acaciatreesoftware.com

email@hidden
740.590.0009



On Mar 13, 2008, at 4:50 PM, Tom Harrington wrote:

I'm trying to upload a file with the NSURL* API, but on the server end
the PHP code is unable to decode the $_FILES array.  The PHP code
works fine when posted from an HTML form (and from clients on other
platforms).

Traffic sniffed on the wire looks good as far as I can tell, so what
would be the problem?  The code in question follows.

	NSString *urlString = @"http://server:8080/php/post.php";;
	NSURL *url = [NSURL URLWithString:urlString];
	NSString *requestMethod = @"POST";

	NSMutableURLRequest *req = [NSMutableURLRequest requestWithURL:url];
	[req setHTTPMethod:requestMethod];

	NSString *headerFieldName;
	NSString *headerFieldValue;

NSString *boundary = @"-----------------------------1234567890";

headerFieldName = @"Content-Type";
headerFieldValue = [NSString stringWithFormat:@"multipart/form-data;
boundary=%@", boundary];
[req addValue:headerFieldValue forHTTPHeaderField:headerFieldName];

NSString *phone = @"7195554321";
NSDate *currentDate = [NSDate date];
NSDateFormatter *dateFormatter = [[[NSDateFormatter alloc] init] autorelease];
[dateFormatter setDateFormat:@"yyyyMMddHHmmss"];
NSString *dateString = [dateFormatter stringFromDate:currentDate];

// Will look something like this: form-data; name="file";
filename="7195554321_1_20080311132327_jpg"
headerFieldValue = [NSString stringWithFormat:@"form-data;
name=\"file\"; filename=\"%@_1_%@_jpg\"", phone, dateString];

NSMutableData *postBody = [NSMutableData data];
// Add ----boundary
[postBody appendData:[[NSString stringWithFormat:@"%@\r\n", boundary]
dataUsingEncoding:NSUTF8StringEncoding]];
// Add form-data with filename
[postBody appendData:[[NSString
stringWithFormat:@"Content-Disposition: %@\r\n", headerFieldValue]
dataUsingEncoding:NSUTF8StringEncoding]];
// Add content-type
[postBody appendData:[[NSString stringWithString:@"Content-Type:
null\r\n\r\n"] dataUsingEncoding:NSUTF8StringEncoding]];
// Add image data
[postBody appendData:imageData];
// Add ----boundary--
[postBody appendData:[[NSString stringWithFormat:@"\r\n%@--\r\n",
boundary] dataUsingEncoding:NSUTF8StringEncoding]];

[req setHTTPBody:postBody];


	NSHTTPURLResponse *res = nil;
	NSError *err = nil;

	NSData *data = [NSURLConnection sendSynchronousRequest:req
										 returningResponse:&res
													 error:&err];


-- Tom Harrington email@hidden AIM: atomicbird1 _______________________________________________

Cocoa-dev mailing list (email@hidden)

Please do not post admin requests or moderator comments to the list.
Contact the moderators at cocoa-dev-admins(at)lists.apple.com

Help/Unsubscribe/Update your Subscription:
This email sent to email@hidden

_______________________________________________

Cocoa-dev mailing list (email@hidden)

Please do not post admin requests or moderator comments to the list.
Contact the moderators at cocoa-dev-admins(at)lists.apple.com

Help/Unsubscribe/Update your Subscription:
This email sent to email@hidden


  • Follow-Ups:
    • Re: File upload with NSURLRequest fails
      • From: "Tom Harrington" <email@hidden>
References: 
 >File upload with NSURLRequest fails (From: "Tom Harrington" <email@hidden>)

  • Prev by Date: A Request Regarding Subject Lines
  • Next by Date: Re: Can core data save to a remote file?
  • Previous by thread: Re: File upload with NSURLRequest fails
  • Next by thread: Re: File upload with NSURLRequest fails
  • Index(es):
    • Date
    • Thread