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

Web API 2中的文件上载问题,html表单post除外

柯翔
2023-03-14

Web API 2中的文件上载问题

虽然我上传文件与表单后此工作文件,但当我发送相同的信息从Rest客户端像邮递员在谷歌Chrome或张贴文件信息与Android或iOS应用程序Web Api 2代码不检测文件多部分/表格-员额

下面是我的html代码

    <form enctype="multipart/form-data" method="post" action="/api/feedback">
    <input type="text" name="Scope" placeholder="Scope" value="feedback">
    <input type="text" name="Lang" placeholder="Lang" value="en">
    <input type="text" name="Collection" placeholder="Collection" value="7b22437573746f6d65724964223a392c2253657276696365526571756573744964223a312c224174746974756465223a332e322c22576f726b457468696373223a342e322c2248796769656e65223a352c22416d6f757450616964223a333132332e327d">
    <input type="file" name="Photo1" placeholder="Photo1">
    <input type="file" name="Photo2" placeholder="Photo2">
    <input type="file" name="Signature" placeholder="Signature">
    <input type="submit" value="Submit">
</form>

这NETWebAPI 2代码

        public async Task<Result> Post()
    {
        var model = new ApiData();
        var result = new Result();
        if (Request.Content.IsMimeMultipartContent())
        {
            try
            {
                string root = HttpContext.Current.Server.MapPath("~/assets/temp");
                var provider = new MultipartFormDataStreamProvider(root);

                var sb = new System.Text.StringBuilder(); // Holds the response body
                // Read the form data and return an async task.
                await Request.Content.ReadAsMultipartAsync(provider);
                // This illustrates how to get the form data.
                foreach (var key in provider.FormData.AllKeys)
                {
                    foreach (var val in provider.FormData.GetValues(key))
                    {
                        if (key.Equals("Scope"))
                            model.Scope = val;
                        if (key.Equals("Lang"))
                            model.Lang = val;
                        if (key.Equals("Collection"))
                            model.Collection = val;
                    }

                }
                if (!model.Scope.Equals("feedback", StringComparison.InvariantCultureIgnoreCase))
                    result.Text = "Missing Scope.";
                else
                {
                    var Util = new Utils();
                    model.Collection = Util.ToString(model.Collection);
                    var _Feedback = JsonConvert.DeserializeObject<Feedback>(model.Collection);
                    try
                    {
                        // This illustrates how to get the file names for uploaded files.
                        foreach (var file in provider.FileData)
                        {
                            FileInfo fileInfo = new FileInfo(file.LocalFileName);
                            string BaseUrl = HttpContext.Current.Server.MapPath("~/assets/feedback/");
                            string oldFile = file.Headers.ContentDisposition.FileName.TrimStart('"').TrimEnd('"');
                            string NewName = string.Format("{0}{1}", Util.NewGuid, Path.GetExtension(oldFile));
                            if (file.Headers.ContentDisposition.Name.ToLower().Contains("photo"))
                            {
                                _Feedback.Photos = string.IsNullOrEmpty(_Feedback.Photos) ? NewName : _Feedback.Photos + "," + NewName;
                                fileInfo.MoveTo(BaseUrl + NewName);
                            }
                            else if (string.IsNullOrEmpty(_Feedback.Signatures) && file.Headers.ContentDisposition.Name.ToLower().Contains("signature"))
                            {
                                _Feedback.Signatures = NewName;
                                fileInfo.MoveTo(BaseUrl + NewName);
                            }
                        }
                    }
                    catch { }

                    if (Util.IsRequired(_Feedback.CustomerId)
                            && Util.IsRequired(_Feedback.ServiceRequestId)
                            && Util.IsRequired(_Feedback.Attitude)
                            && Util.IsRequired(_Feedback.WorkEthics)
                            && Util.IsRequired(_Feedback.Hygiene)
                            )
                    {
                        var feedback = new Feedback()
                        {
                            CustomerId = _Feedback.CustomerId,
                            ServiceRequestId = _Feedback.ServiceRequestId,
                            Attitude = _Feedback.Attitude,
                            WorkEthics = _Feedback.WorkEthics,
                            Hygiene = _Feedback.Hygiene,
                            AmoutPaid = _Feedback.AmoutPaid,
                            Photos = _Feedback.Photos,
                            Signatures = _Feedback.Signatures,
                            Created = DateTime.UtcNow,
                            Updated = DateTime.UtcNow
                        };

                        db.Feedbacks.Add(feedback);
                        db.SaveChanges();
                        if (feedback.Id != default(int))
                        {
                            result.Success = true;
                            result.Text = "Success";
                        }
                    }
                    else
                    {
                        result.Text = "Required Parameters missing.";
                    }
                }
            }
            catch
            {
                result.Text = "Error";
            }
        }
        else
            result.Text = "Signature or photo missing";
        return result;
    }

这是邮递员的要求

在Fiddler客户端中公开post请求时,我已经看到,当使用html表单post发布时,在多部分/表单数据中存在边界;虽然邮递员和其他客户没有界限。

共有2个答案

杨海
2023-03-14

我知道这是一个老帖子,但我认为这可以帮助有同样问题的人。在postman中删除内容类型标题。这项请求将很快通过。

施越彬
2023-03-14

这可能是邮递员的错误。

总而言之,如果使用Postman设置内容类型标题,它似乎会覆盖默认浏览器功能,而不会添加边界。大多数情况下,这是一件好事,但对于多部分/表单数据来说并非如此,因为我们需要浏览器为我们添加边界。尝试删除内容类型标题。当发送实际文章时,浏览器将自动添加适当的标题并创建边界。

您的WebApi代码看起来不错。如果你的检查结果是错误的。

//This will be false since it's a malformed request.
if (Request.Content.IsMimeMultipartContent())
 类似资料:
  • 我有问题上传表单使用php,我曾经创建过这样的页面,但由于某种原因,这似乎是渲染,我希望我只是错过了一些如此简单的东西。Im试图创建和上传表单,以上传Wav、rar、zip和txt文件,并返回其他所有的错误。 如果我尝试上传一个与这些文件无关的文件,它会显示一个错误,但如果我尝试上传一个wav或一个zip文件,它不会工作,我不会得到任何类型的错误报告,但如果我要上传一个.txt文件,它似乎工作良好

  • 在使用文件上传HTML表单和一些PHP来处理输入时,我感到困惑。在表格中,我为图像选择了两个文件。上载.png文件时,我可以使用$\u文件获取文件大小等信息。但是,当我试图上传一个.jpg文件时,我无法获得比文件名更多的信息,没有大小、类型、临时名称。 当同时上传两个文件时,. png和. jpg,一切都适用于. png文件,但不适用于. jpg。 我错过了什么?在使用带有.jpg文件类型的$\u

  • 我正在开发一个必须接收excel文件的POST方法,但我有一些问题。这是我的密码 当我调用API时,在服务器端出现以下错误: 在我的web.xml中,我添加了以下代码: 我在Tomcat v7.0上运行,并添加了jersey-multipart-1.18和mimepul-1.9.3来管理Multipart数据。 我的客户端响应获得415个不受支持的媒体类型,但在我用于发送请求I的代码中,请求“Co

  • 我有一个多部分表单,其中请求的第一部分是表单数据,第二部分是文件。请求的第一部分缺少一个文件名,第二部分有一个空的有效负载,二进制内容应该在其中显示。 第一个内容处置缺少文件名="消息"。我试着把它改成Blob,但是负载是空的。不管我怎么做,我都无法让文件显示在负载中。它应该显示类似于PDF的东西 我的ajax请求:

  • 我在PHP中有丰富的经验,但对ASP.NET还是个新手。我在网上找到了一些教程,这些教程让我走了这么远,但是我现在遇到了一些问题。 所以总结一下我想要完成的,我有一个页面,我想让用户提交比赛参赛作品。我使用一个HTML表单来收集东西,如条目标题,描述,并希望允许他们能够提交一个图像代表他们的条目。 当他们选择提供图像时,我希望使用类似于://entry//entry-image的路径上传图像。 我

  • 我希望用户单击一个按钮,一次上载一个文档。 目前,当用户上载文档时,它会将“documents”控件标记为满意。但是,如果用户尝试上载另一个文档,但随后取消,则会将控件标记为不满意。它仍然有第一个文档,但在文件资源管理器上单击“取消”似乎会使验证器认为没有上载任何文档。我怎样才能避开这件事? 在我的html中: 在我的.ts中: 现在,我的upoadDocument()函数对验证没有任何作用。