Web services 如何上传图像并将一些数据发布到MVC4 wep api方法?
我已经试了好几天了,但没有取得任何成功。我需要发布图像及其信息(s.t.创建的用户名) 这是我的方法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())
[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;
有关更详细的示例,请参见: