This question will be a nice tutorial for http connection “POST” between Iphone and asp.net server 🙂 what i’m trying to do is to send an image from iphone to Asp.net server;
Here my uploadImage fonction in objective-c :
- (IBAction)uploadImage {
/*
turning the image into a NSData object
getting the image back out of the UIImageView
setting the quality to 90
*/
NSData *imageData = UIImageJPEGRepresentation(image.image, 33);
// setting up the URL to post to
NSString *urlString = @"MyWebServiceUrl";
// setting up the request object now
NSMutableURLRequest *request = [[[NSMutableURLRequest alloc] init] autorelease];
[request setURL:[NSURL URLWithString:urlString]];
[request setHTTPMethod:@"POST"];
/*
add some header info now
we always need a boundary when we post a file
also we need to set the content type
You might want to generate a random boundary.. this is just the same
as my output from wireshark on a valid html post
*/
NSString *boundary = [NSString stringWithString:@"---------------------------14737809831466499882746641449"];
NSString *contentType = [NSString stringWithFormat:@"multipart/form-data; boundary=%@",boundary];
[request addValue:contentType forHTTPHeaderField: @"Content-Type"];
/*
now lets create the body of the post
*/
NSMutableData *body = [NSMutableData data];
[body appendData:[[NSString stringWithFormat:@"rn--%@rn",boundary] dataUsingEncoding:NSUTF8StringEncoding]];
[body appendData:[[NSString stringWithString:@"Content-Disposition: form-data; filepath="ProfilePic"; filename="ipodfile"rn"] dataUsingEncoding:NSUTF8StringEncoding]];
[body appendData:[[NSString stringWithString:@"Content-Type: application/octet-streamrnrn"] dataUsingEncoding:NSUTF8StringEncoding]];
[body appendData:[NSData dataWithData:imageData]];
[body appendData:[[NSString stringWithFormat:@"rn--%@--rn",boundary] dataUsingEncoding:NSUTF8StringEncoding]];
// setting the body of the post to the reqeust
[request setHTTPBody:body];
// now lets make the connection to the web
NSData *returnData = [NSURLConnection sendSynchronousRequest:request returningResponse:nil error:nil];
NSString *returnString = [[NSString alloc] initWithData:returnData encoding:NSUTF8StringEncoding];
NSLog(@"%@", returnString);
}
And here is my webService Fonctions that parse the data sent and save the file :
public class SaveData : IHttpHandler
{
public void ProcessRequest(HttpContext context)
{
context.Response.ContentType = "text/plain";
bool hasErrors = false;
HttpFileCollection filesPosted = context.Request.Files;
String filePath = context.Request.QueryString["filepath"];
String fileName = context.Request.QueryString["filename"];
try
{
if (String.IsNullOrEmpty(fileName) || String.IsNullOrEmpty(filePath) || filesPosted.Count <= 0)
hasErrors = true;
if (!hasErrors)
{
HttpContext.Current.Response.Write(WriteFile(filesPosted[0], filePath, fileName));
}
else
{
context.Response.Write("Failed: parsing error");
}
}
catch (Exception ex)
{
context.Response.Write("Failed: exception error:::" + ex.Message);
}
}
private string WriteFile(HttpPostedFile file, String filePath, String fileName)
{
System.IO.Directory.CreateDirectory(filePath);
int counter = 0;
string path = String.Format("{0}\{1}.jpg", filePath, fileName);
while (System.IO.File.Exists(path))
{
counter++;
path = String.Format("{0}\{1}-{2}.jpg", filePath, fileName, counter);
}
file.SaveAs(path);
return path;
}
public bool IsReusable
{
get
{
return false;
}
}
}
my problem come from this two lines
String filePath = context.Request.QueryString["filepath"];
String fileName = context.Request.QueryString["filename"];
context.Request.QueryString is returning null so my hasErrors is false; any ideas how to fix that will be so appreciated, thanks for all.
Answers:
Thank you for visiting the Q&A section on Magenaut. Please note that all the answers may not help you solve the issue immediately. So please treat them as advisements. If you found the post helpful (or not), leave a comment & I’ll get back to you as soon as possible.
Method 1
The query string gets populated from the Url parameters (http://someserver.com/foobar?field1=value1&field2=value2)
To access form data sent in the POST body, use either Request.Form["filepath"] or the shorthand Request["filepath"], which looks for the item in the Form, QueryString, Cookies and ServerVariables collection.
Data of posted files can be found in Request.Files
Method 2
here the solution after a day of trying:
client code:
// post body
NSMutableData *body = [NSMutableData data];
// add params (all params are strings)
[body appendData:[[NSString stringWithFormat:@"--%@rn", boundary] dataUsingEncoding:NSUTF8StringEncoding]];
[body appendData:[[NSString stringWithFormat:@"Content-Disposition: form-data; name="%@"rnrn", @"filename"] dataUsingEncoding:NSUTF8StringEncoding]];
[body appendData:[[NSString stringWithFormat:@"%@rn", imageName] dataUsingEncoding:NSUTF8StringEncoding]];
// add image data
if (imageData) {
[body appendData:[[NSString stringWithFormat:@"--%@rn", boundary] dataUsingEncoding:NSUTF8StringEncoding]];
[body appendData:[[NSString stringWithFormat:@"Content-Disposition: form-data; name="myImage"; filename="image.jpg"rn"] dataUsingEncoding:NSUTF8StringEncoding]];
[body appendData:[[NSString stringWithString:@"Content-Type: image/jpegrnrn"] dataUsingEncoding:NSUTF8StringEncoding]];
[body appendData:imageData];
[body appendData:[[NSString stringWithFormat:@"rn"] dataUsingEncoding:NSUTF8StringEncoding]];
}
Asp.net Server code:
String filePath = context.Request.Form["filename"];
hope you like this question(tutorial) 😉
All methods was sourced from stackoverflow.com or stackexchange.com, is licensed under cc by-sa 2.5, cc by-sa 3.0 and cc by-sa 4.0