当前位置: 首页 > 知识库问答 >
问题:

如何使用Web API上传文件和提交表单数据?

燕经国
2023-03-14

出身背景

我目前有一个正在工作的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”:“此资源不支持请求实体的媒体类型‘multipart/form data’。”,“ExceptionMessage”:“没有MediaTypeFormatter可用于从媒体类型为“multipart/form data”的内容中读取类型为“CompanyTo”的对象。”,“ExceptionType”:“System.Net.Http.UnsupportedMediaTypeException”,“StackTrace”:“在System.Net.Http.HttpContentExtensions.ReadAsAsync[T](HttpContent内容,类型,IEnumerable1格式化程序,IFormatterLogger格式化程序记录器,CancellationToken CancellationToken)\r\n在System.Net.Http.HttpContentExtensions.ReadAsync(HttpContent内容、类型、IEnumerable1格式化程序、IFormatterLogger格式化程序记录器、CancellationToken CancellationToken)\r\n在系统上。网状物Http。模型绑定。FormatterParameterBinding。ReadContentAsync(HttpRequestMessage请求,类型类型,IEnumerable1格式化程序,IFormatterLogger格式化程序记录器,CancellationToken CancellationToken)“}

我的问题

那么,如何使用C#和ASP上传一个或多个文件并读取/处理常规表单数据字段呢。网我正在使用Visual Studio 2013(社区版)。另外,我是C#的初学者,因此如果您提到函数/类的位置,我可能需要一些额外的提示/帮助。

我发现与此问题相关的最接近SO的问题是如何在asp中提交带有可选文件数据的表单数据。net web api,但它没有任何响应/答案。。。

共有1个答案

水瀚漠
2023-03-14

以下是我遇到此问题时的解决方案:

客户:

 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);
}
 类似资料:
  • 问题内容: 我意识到这个问题的变体已经出现了很多次,但是我找不到在这种情况下能回答这个问题的人。 我正在使用第三方fileuploader,该文件利用jQuery并在文件上传完成时给出成功回调。 我要实现的是一个带有文本字段的表单以及fileuploader,当您单击“提交”时,该表单将触发上传功能(文件开始使用进度条开始上传),并等待成功回调之前继续提交表格。 我必须立即承认我是jQuery的白

  • 问题内容: 我有一个简单的文件上传表格。选择文件后,如何使其自动提交?我不希望用户必须单击“提交”按钮。 问题答案: 您可以在输入文件时简单地调用表单的方法。

  • 问题内容: 我想通过ajax调用使用WebApi上传文件,该文件将保存到数据库中。我尝试了此链接中 给出的代码 。在这里,它将接收到的数据作为未指定扩展名的文件保存到硬盘驱动器中,但是我想要执行类似将文件保存到数据库时的操作,我也想保存文件名和扩展名原因,如果以后需要要下载文件,我可以提供文件名和扩展名。并在链接中将文件作为文件保存到硬盘,但是有什么方法可以直接将文件保存到DB。 问题答案: 答案

  • 问题内容: 我想将文件和json数据从HttpClient发送到Web api服务器。 我似乎无法通过有效载荷访问服务器中的json,只能作为json变量。 这是客户: 您能否建议在相同的请求下如何访问文件和提交的json和文件? 谢谢 问题答案: 我尝试了多种方法来提交文件数据和元数据,这是我发现的最佳方法: 不要使用MultipartFormDataContent,仅将StreamConten

  • 本文向大家介绍php实现表单提交上传文件功能,包括了php实现表单提交上传文件功能的使用技巧和注意事项,需要的朋友参考一下 本文实例为大家分享了php实现表单提交上传文件功能的具体代码,供大家参考,具体内容如下 首先创建含表单的html文件:upload.html 再创建服务端文件:upload.php 点击提交后呈现出文件: 本文已被整理到了《php文件上传操作汇总》 ,更多精彩内容,欢迎大家学

  • 问题内容: 我有一个带有以下输入标记的HTML页面: 单击页面上的按钮将打开文件对话框。如果要进行实际的上载,则需要另一个按钮来单击(提交),因为此输入文件按钮仅用于提供文件的路径。 选择文件后,是否可以单击浏览按钮,选择文件并立即启动上传功能?如果是,任何人都可以提供代码段吗?谢谢。 问题答案: 如果您希望在用户选择之后提交表单,则只需添加