如何上传图像并将一些数据发布到MVC 4 web api方法?

时间:2012-05-29 19:32:54

标签: 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())
        {
            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;
    }

这是我的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;
        }
    }
}

当我发布图片和“createdByName”时,我可以访问图片,但我无法参数。我该怎么做?

谢谢。

1 个答案:

答案 0 :(得分:1)

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

var parts = o.Result;

HttpContent namePart = parts.FirstDispositionNameOrDefault("createdByName");
if (namePart == null)
{
  throw new HttpResponseException(HttpStatusCode.BadRequest);
}
string name = namePart.ReadAsStringAsync().Result;

有关更详细的示例,请参阅:

http://www.asp.net/web-api/overview/working-with-http/html-forms-and-multipart-mime#multipartmime