I'm trying to upload a UIImage in monotouch to my server (nodeJS).
I've tried every possible solution found on SO and elsewhere on the net to no avail.
Basically I have a UIImage which I'm converting to a byte[] using:
public byte[] GetMergedBytes(UIImage img)
{
byte[] filedata = null;
using (NSData imageData = img.AsPNG()) {
filedata = new byte[imageData.Length];
System.Runtime.InteropServices.Marshal.Copy (imageData.Bytes, filedata, 0, Convert.ToInt32 (imageData.Length));
}
return filedata;
}
Then I post this using a variety of different methods to my server including: Upload files with HTTPWebrequest (multipart/form-data)
When I try using CURL, my server responds correctly:
curl -F "fileupload=@logo.png" -F "name=blah" http://xxx.xxx.xxx.xx/upload
For completion, I'm using nodeJS with expressJS:
app.post('/upload', function(req, res, files) {
console.log(req.files);
console.log(files);
}
With CURL I get the following from the console.log on the server:
{ fileupload:
{ domain: null,
_events: null,
_maxListeners: 10,
size: 88270,
path: '/tmp/9ab5c9b1ea6da91e4e16ea711636b9bb',
name: 'logo.png',
type: 'application/octet-stream',
hash: false,
lastModifiedDate: Thu Jan 31 2013 07:26:43 GMT+0000 (UTC),
_writeStream:
{ domain: null,
_events: null,
_maxListeners: 10,
path: '/tmp/9ab5c9b1ea6da91e4e16ea711636b9bb',
fd: 9,
writable: false,
flags: 'w',
encoding: 'binary',
mode: 438,
bytesWritten: 88270,
busy: false,
_queue: [],
_open: [Function],
drainable: true },
length: [Getter],
filename: [Getter],
mime: [Getter] } }
with any other method, the same console.log
returns:
{}
Any ideas? I've been going crazy over here!
UPDATE
Fixed it. I'm now using RestSharp instead and it works like a charm with very little lines of code...
byte[] filedata = GetFileBytes(file);
var client = new RestClient ("http://server");
var request = new RestRequest ("upload", Method.POST);
request.AddParameter("name", "parameter1);
request.AddParameter("name2", id);
request.AddFile("file", filedata, "somename.png", "image/png");
RestResponse response = (RestResponse)client.Execute(request);
var content = response.Content;
return content;