如何使用Web上传文件和提交表单数据API?
How to upload files and submit form data using Web API?
背景
我目前正在使用 C# 代码从网页读取 HTTP POST 表单提交中的值。它看起来像这样:
public class CompanyDTO
{
public string CompanyName { get; set; }
public string Address1 { get; set; }
public string Address2 { get; set; }
public string City { get; set; }
public string State { get; set; }
public string ZIP { get; set; }
}
// POST: api/Submission
public HttpResponseMessage Post(CompanyDTO Company)
{
return JsonToBrowser("{'location':'" + Company.City + "," + Company.State + "'}");
}
我还有从页面上的文件上传控件读取附件的工作代码:
// POST: api/Submission
public HttpResponseMessage Post()
{
// Process and save attachments/uploaded files
var folderName = "App_Data";
var PATH = HttpContext.Current.Server.MapPath("~/" + folderName);
var rootUrl = Request.RequestUri.AbsoluteUri.Replace(Request.RequestUri.AbsolutePath, String.Empty);
if (Request.Content.IsMimeMultipartContent())
{
var streamProvider = new CustomMultipartFormDataStreamProvider(PATH);
var task = Request.Content.ReadAsMultipartAsync(streamProvider).ContinueWith<IEnumerable<FileDesc>>(t =>
{
if (t.IsFaulted || t.IsCanceled)
{
throw new HttpResponseException(HttpStatusCode.InternalServerError);
}
var fileInfo = streamProvider.FileData.Select(i =>
{
var info = new FileInfo(i.LocalFileName);
return new FileDesc(info.Name, rootUrl + "/" + folderName + "/" + info.Name, info.Length / 1024);
});
return fileInfo;
});
return JsonToBrowser("{'status':'success'}");
}
else
{
throw new HttpResponseException(Request.CreateResponse(HttpStatusCode.NotAcceptable, "This request is not properly formatted"));
}
}
显然最后一段代码还有一些内容,但我希望它至少能说明我的问题。
我的问题
我现在正在尝试合并这两段代码。我认为这就像将数据传输对象放在 Post 函数中一样简单:
public HttpResponseMessage Post(CompanyDTO Company)
这会导致在我执行 HTTP POST 时向浏览器返回以下内容:
{ "Message":"The request entity's media type 'multipart/form-data' is
not supported for this resource.", "ExceptionMessage":"No
MediaTypeFormatter is available to read an object of type
'CompanyDTO' from content with media type
'multipart/form-data'.",
"ExceptionType":"System.Net.Http.UnsupportedMediaTypeException",
"StackTrace":" at
System.Net.Http.HttpContentExtensions.ReadAsAsync[T](HttpContent
content, Type type, IEnumerable1 formatters, IFormatterLogger
formatterLogger, CancellationToken cancellationToken)\r\n at
System.Net.Http.HttpContentExtensions.ReadAsAsync(HttpContent content,
Type type, IEnumerable1 formatters, IFormatterLogger formatterLogger,
CancellationToken cancellationToken)\r\n at
System.Web.Http.ModelBinding.FormatterParameterBinding.ReadContentAsync(HttpRequestMessage
request, Type type, IEnumerable1 formatters, IFormatterLogger
formatterLogger, CancellationToken cancellationToken)" }
我的问题
那么我如何使用 C# 和 ASP.NET 上传一个或多个文件和 read/process 常规表单数据字段。我使用的是 Visual Studio 2013(社区版)。
另外,我是 C# 的初学者,所以我可能需要一些额外的 hints/help 如果你参考 function/class 关于在哪里可以找到它。
我发现与此问题相关的最接近的 SO 问题是 How to submit form-data with optional file data in asp.net web api 但它没有任何 response/answer...
这是我遇到这个问题时的解决方案:
客户:
public async Task UploadImage(byte[] image, string url)
{
Stream stream = new System.IO.MemoryStream(image);
HttpStreamContent streamContent = new HttpStreamContent(stream.AsInputStream());
Uri resourceAddress = null;
Uri.TryCreate(url.Trim(), UriKind.Absolute, out resourceAddress);
Windows.Web.Http.HttpRequestMessage request = new Windows.Web.Http.HttpRequestMessage(Windows.Web.Http.HttpMethod.Post, resourceAddress);
request.Content = streamContent;
var httpClient = new Windows.Web.Http.HttpClient();
var cts = new CancellationTokenSource();
Windows.Web.Http.HttpResponseMessage response = await httpClient.SendRequestAsync(request).AsTask(cts.Token);
}
控制器:
public async Task<HttpResponseMessage> Post()
{
Stream requestStream = await this.Request.Content.ReadAsStreamAsync();
byte[] byteArray = null;
using (MemoryStream ms = new MemoryStream())
{
await requestStream.CopyToAsync(ms);
byteArray = ms.ToArray();
}
.
.
.
return Request.CreateResponse(HttpStatusCode.OK);
}
背景
我目前正在使用 C# 代码从网页读取 HTTP POST 表单提交中的值。它看起来像这样:
public class CompanyDTO
{
public string CompanyName { get; set; }
public string Address1 { get; set; }
public string Address2 { get; set; }
public string City { get; set; }
public string State { get; set; }
public string ZIP { get; set; }
}
// POST: api/Submission
public HttpResponseMessage Post(CompanyDTO Company)
{
return JsonToBrowser("{'location':'" + Company.City + "," + Company.State + "'}");
}
我还有从页面上的文件上传控件读取附件的工作代码:
// POST: api/Submission
public HttpResponseMessage Post()
{
// Process and save attachments/uploaded files
var folderName = "App_Data";
var PATH = HttpContext.Current.Server.MapPath("~/" + folderName);
var rootUrl = Request.RequestUri.AbsoluteUri.Replace(Request.RequestUri.AbsolutePath, String.Empty);
if (Request.Content.IsMimeMultipartContent())
{
var streamProvider = new CustomMultipartFormDataStreamProvider(PATH);
var task = Request.Content.ReadAsMultipartAsync(streamProvider).ContinueWith<IEnumerable<FileDesc>>(t =>
{
if (t.IsFaulted || t.IsCanceled)
{
throw new HttpResponseException(HttpStatusCode.InternalServerError);
}
var fileInfo = streamProvider.FileData.Select(i =>
{
var info = new FileInfo(i.LocalFileName);
return new FileDesc(info.Name, rootUrl + "/" + folderName + "/" + info.Name, info.Length / 1024);
});
return fileInfo;
});
return JsonToBrowser("{'status':'success'}");
}
else
{
throw new HttpResponseException(Request.CreateResponse(HttpStatusCode.NotAcceptable, "This request is not properly formatted"));
}
}
显然最后一段代码还有一些内容,但我希望它至少能说明我的问题。
我的问题
我现在正在尝试合并这两段代码。我认为这就像将数据传输对象放在 Post 函数中一样简单:
public HttpResponseMessage Post(CompanyDTO Company)
这会导致在我执行 HTTP POST 时向浏览器返回以下内容:
{ "Message":"The request entity's media type 'multipart/form-data' is not supported for this resource.", "ExceptionMessage":"No MediaTypeFormatter is available to read an object of type 'CompanyDTO' from content with media type 'multipart/form-data'.", "ExceptionType":"System.Net.Http.UnsupportedMediaTypeException", "StackTrace":" at System.Net.Http.HttpContentExtensions.ReadAsAsync[T](HttpContent content, Type type, IEnumerable1 formatters, IFormatterLogger formatterLogger, CancellationToken cancellationToken)\r\n at System.Net.Http.HttpContentExtensions.ReadAsAsync(HttpContent content, Type type, IEnumerable1 formatters, IFormatterLogger formatterLogger, CancellationToken cancellationToken)\r\n at System.Web.Http.ModelBinding.FormatterParameterBinding.ReadContentAsync(HttpRequestMessage request, Type type, IEnumerable1 formatters, IFormatterLogger formatterLogger, CancellationToken cancellationToken)" }
我的问题
那么我如何使用 C# 和 ASP.NET 上传一个或多个文件和 read/process 常规表单数据字段。我使用的是 Visual Studio 2013(社区版)。 另外,我是 C# 的初学者,所以我可能需要一些额外的 hints/help 如果你参考 function/class 关于在哪里可以找到它。
我发现与此问题相关的最接近的 SO 问题是 How to submit form-data with optional file data in asp.net web api 但它没有任何 response/answer...
这是我遇到这个问题时的解决方案:
客户:
public async Task UploadImage(byte[] image, string url)
{
Stream stream = new System.IO.MemoryStream(image);
HttpStreamContent streamContent = new HttpStreamContent(stream.AsInputStream());
Uri resourceAddress = null;
Uri.TryCreate(url.Trim(), UriKind.Absolute, out resourceAddress);
Windows.Web.Http.HttpRequestMessage request = new Windows.Web.Http.HttpRequestMessage(Windows.Web.Http.HttpMethod.Post, resourceAddress);
request.Content = streamContent;
var httpClient = new Windows.Web.Http.HttpClient();
var cts = new CancellationTokenSource();
Windows.Web.Http.HttpResponseMessage response = await httpClient.SendRequestAsync(request).AsTask(cts.Token);
}
控制器:
public async Task<HttpResponseMessage> Post()
{
Stream requestStream = await this.Request.Content.ReadAsStreamAsync();
byte[] byteArray = null;
using (MemoryStream ms = new MemoryStream())
{
await requestStream.CopyToAsync(ms);
byteArray = ms.ToArray();
}
.
.
.
return Request.CreateResponse(HttpStatusCode.OK);
}