在C#中使用HttpWebRequest来模仿curl的POST多部分表单

时间:2013-01-31 07:36:38

标签: c# node.js xamarin.ios multipartform-data express

我正在尝试将monotouch中的UIImage上传到我的服务器(nodeJS)。

我已经尝试过在SO和其他网络上找到的所有可能的解决方案都无济于事。

基本上我有一个UIImage,我正在使用:

转换为byte []
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;
    }

然后我使用各种不同的方法将其发布到我的服务器,包括: Upload files with HTTPWebrequest (multipart/form-data)

当我尝试使用CURL时,我的服务器响应正确:

curl  -F "fileupload=@logo.png" -F "name=blah" http://xxx.xxx.xxx.xx/upload

为了完成,我正在使用nodeJS和expressJS:

app.post('/upload', function(req, res, files) {
console.log(req.files);
console.log(files);
}

使用CURL,我从服务器上的console.log获得以下内容:

{ 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] } }

使用任何其他方法,相同的console.log返回:

{}

有什么想法吗?我在这里疯了!

更新

修正了它。我现在正在使用RestSharp,它就像一个带有很少代码行的魅力......

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;

1 个答案:

答案 0 :(得分:0)

更新

修正了它。我现在正在使用RestSharp,它就像一个带有很少代码行的魅力......

    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;