Web services 如何上传图像并将一些数据发布到MVC4 wep api方法?

Web services 如何上传图像并将一些数据发布到MVC4 wep api方法?,web-services,file-upload,asp.net-mvc-4,asp.net-web-api,Web Services,File Upload,Asp.net Mvc 4,Asp.net Web Api,我已经试了好几天了,但没有取得任何成功。我需要发布图像及其信息(s.t.创建的用户名) 这是我的方法 [HttpPost] public Task<HttpResponseMessage> PostFile(string createdByName) { HttpRequestMessage request = this.Request; if (!request.Content.IsMimeMultipartContent())

我已经试了好几天了,但没有取得任何成功。我需要发布图像及其信息(s.t.创建的用户名)

这是我的方法

[HttpPost]
    public Task<HttpResponseMessage> PostFile(string createdByName)
    {
        HttpRequestMessage request = this.Request;
        if (!request.Content.IsMimeMultipartContent())
        {
            throw new HttpResponseException(HttpStatusCode.UnsupportedMediaType);
        }

        string root = System.Configuration.ConfigurationSettings.AppSettings["TempUploadDir"];
        var provider = new MultipartFormDataStreamProvider(root);

        var task = request.Content.ReadAsMultipartAsync(provider).
            ContinueWith<HttpResponseMessage>(o =>
            {
                AddImages(provider.BodyPartFileNames);
                string file1 = provider.BodyPartFileNames.First().Value;
                // this is the file name on the server where the file was saved 
                return new HttpResponseMessage()
                {
                    Content = new StringContent("File uploaded.")
                };
            }
        );
        return task;
    }
[HttpPost]
公共任务PostFile(字符串createdByName)
{
HttpRequestMessage request=此.request;
如果(!request.Content.IsMimeMultipartContent())
{
抛出新的HttpResponseException(HttpStatusCode.UnsupportedMediaType);
}
string root=System.Configuration.ConfigurationSettings.AppSettings[“TempUploadDir”];
var provider=新的MultipartFormDataStreamProvider(根);
var task=request.Content.ReadAsMultipartAsync(提供程序)。
继续(o=>
{
AddImages(provider.bodyPartFileName);
字符串file1=provider.BodyPartFileNames.First().Value;
//这是保存文件的服务器上的文件名
返回新的HttpResponseMessage()
{
Content=新的StringContent(“上传的文件”)
};
}
);
返回任务;
}
这是我的TypeFormatterClass,它添加了global.asax

public class MultiFormDataMediaTypeFormatter : FormUrlEncodedMediaTypeFormatter
{
    public MultiFormDataMediaTypeFormatter()
        : base()
    {
        this.SupportedMediaTypes.Add(new MediaTypeHeaderValue("multipart/form-data"));
    }

    protected override bool CanReadType(Type type)
    {
        return true;
    }

    protected override bool CanWriteType(Type type)
    {
        return false;
    }

    protected override Task<object> OnReadFromStreamAsync(Type type, Stream stream, HttpContentHeaders contentHeaders, FormatterContext formatterContext)
    {
        var contents = formatterContext.Request.Content.ReadAsMultipartAsync().Result;
        return Task.Factory.StartNew<object>(() =>
        {
            return new MultiFormKeyValueModel(contents);
        });
    }

    class MultiFormKeyValueModel : IKeyValueModel
    {
        IEnumerable<HttpContent> _contents;
        public MultiFormKeyValueModel(IEnumerable<HttpContent> contents)
        {
            _contents = contents;
        }


        public IEnumerable<string> Keys
        {
            get
            {
                return _contents.Cast<string>();
            }
        }

        public bool TryGetValue(string key, out object value)
        {
            value = _contents.FirstDispositionNameOrDefault(key).ReadAsStringAsync().Result;
            return true;
        }
    }
}
公共类MultiFormDataMediaTypeFormatter:FormUrlEncodedMediaTypeFormatter
{
公共多格式数据MediaTypeFormatter()
:base()
{
this.SupportedMediaTypes.Add(新的MediaTypeHeaderValue(“多部分/表单数据”));
}
受保护的覆盖布尔CanReadType(类型)
{
返回true;
}
受保护的覆盖布尔CANRITETYPE(类型)
{
返回false;
}
受保护的重写任务OnReadFromStreamAsync(类型类型、流、HttpContentHeaders contentHeaders、FormatterContext FormatterContext)
{
var contents=formatterContext.Request.Content.ReadAsMultipartAsync().Result;
返回Task.Factory.StartNew(()=>
{
返回新的MultiFormKeyValueModel(目录);
});
}
类多格式mkeyvaluemodel:IKeyValueModel
{
i可数内容;
公共多格式KeyValueModel(IEnumerable内容)
{
_内容=内容;
}
公共IEnumerable密钥
{
得到
{
返回_contents.Cast();
}
}
公共bool TryGetValue(字符串键,输出对象值)
{
value=\u contents.FirstDispositionNameOrDefault(key.ReadAsStringAsync().Result;
返回true;
}
}
}
当我发布图像和“createdByName”时,我可以访问图像,但无法访问参数。我怎样才能做到这一点?


谢谢。

要获取您的createdByName字段,请在ContinueWith中:

var parts = o.Result;

HttpContent namePart = parts.FirstDispositionNameOrDefault("createdByName");
if (namePart == null)
{
  throw new HttpResponseException(HttpStatusCode.BadRequest);
}
string name = namePart.ReadAsStringAsync().Result;
有关更详细的示例,请参见: