从 Xamarin C# 应用程序将图像上传到 Node JS 服务器上的 Multer

Uploading image to Multer on Node JS server from Xamarin C# app

我正在尝试将图像从 PCL Xamarin 表单库上传到 Node JS。我试过使用 Multer Node JS 库来获取 POST 请求。已收到请求,但未保存照片。文件总是 'undefined'.

节点JS代码:

var formidable = require('formidable');
var util = require('util');
var fs = require('fs');
var multer = require('multer');

var storage = multer.diskStorage({
    destination: function (req, file, callback) {
        callback(null, './photouploads');
    },
    filename: function (req, file, callback) {
        console.log(file.fieldname);
        callback(null, file.fieldname + '-' + Date.now());
    }
});

var upload = multer({ storage: storage }).single('image');

exports.post = function (req, res) {
    console.log("Photo Api Hit");
    upload(req, res, function (err) {
        console.log(req.file);
        if (err) {
            console.log("error");
            console.log(err);
            return res.end("Error uploading file.");
        }
        console.log("File has been received");
        res.end("File is uploaded");
    });
};

C#/Xamarin 代码

using Plugin.Media.Abstractions;
using System;
using System.Diagnostics;
using System.IO;
using System.Net.Http;
using System.Net.Http.Headers;

namespace Vigour.Controllers
{
    class MediaController
    {
        public static void upload(MediaFile mediaFile)
        {
            try
            {
                StreamContent scontent = new StreamContent(mediaFile.GetStream());
                scontent.Headers.ContentDisposition = new ContentDispositionHeaderValue("form-data")
                { 
                    FileName = "newimage",
                    Name = "image"
                };
                scontent.Headers.ContentType = new MediaTypeHeaderValue("image/jpeg");
                var client = new HttpClient();
                client.BaseAddress = new Uri(Constants.API_ROOT_URL);
                var result = client.PostAsync("api/photo", scontent).Result;
                Debug.WriteLine(result.ReasonPhrase);
            }
            catch (Exception e)
            {
                Debug.WriteLine(e);
            }
        }
}
}

有谁知道在我的 C# 代码中应该如何形成请求?谢谢

我发现使用这个方法对PCL

有效

MediaFile 是 Xamarin.Plugins.Media 库中的一个对象

 public static void upload(MediaFile mediaFile)
 {
            try
            {
                StreamContent scontent = new StreamContent(mediaFile.GetStream());
                scontent.Headers.ContentDisposition = new ContentDispositionHeaderValue("form-data")
                {
                    FileName = "newimage",
                    Name = "image"
                };
                scontent.Headers.ContentType = new MediaTypeHeaderValue("image/jpeg");

                var client = new HttpClient();
                var multi = new MultipartFormDataContent();
                multi.Add(scontent);
                client.BaseAddress = new Uri(Constants.API_ROOT_URL);
                var result = client.PostAsync("api/photo", multi).Result;
                Debug.WriteLine(result.ReasonPhrase);
            }
            catch (Exception e)
            {
                Debug.WriteLine(e);
            }
  }

我使用节点 js(托管在 azure 上)来接收请求。

var formidable = require('formidable');
var util = require('util');
var fs = require('fs');
var multer = require('multer');

var storage = multer.diskStorage({
    destination: function (req, file, callback) {
        callback(null, './uploads');
    },
    filename: function (req, file, callback) {
        console.log(file.fieldname);
        callback(null, file.fieldname + '-' + Date.now());
    }
});

var upload = multer({ storage: storage }).single('image');

exports.post = function (req, res) {
    console.log("Photo Api Hit");
    upload(req, res, function (err) {
        console.log(req.file);
        if (err) {
            console.log("Photo API ERROR: "+err);
            return res.end("Error uploading file.");
        }
        console.log("SUCCESS");
        res.end("File is uploaded");
    });
};