【问题标题】:Writing server-side handler for jquery file upload为 jquery 文件上传编写服务器端处理程序
【发布时间】:2018-04-20 11:04:44
【问题描述】:

我正在尝试让 blueimp jQuery-File-Upload 组件在我的 MVC 应用程序中工作。

这是我目前的代码。

JavaScript:

$('#fileupload').fileupload({
    url: '@Url.Action("AddAttachment", "File")',
    dataType: 'json',
    progressall: function (e, data) {
        var progress = parseInt(data.loaded / data.total * 100, 10);
        console.log(progress);
    },
    add: function(e, data) {
        data.submit();
    },
    done: function (e, data) {
        $.each(data.result.files, function (index, file) {
            $('<p/>').text(file.name).appendTo(document.body);
        });
    }
});

控制器:

[HttpPost]
public JsonResult AddAttachment()
{
    var files = new List<FileAttachmentFileModel>();

    try
    {
        if (Request.Files.Count > 0)
        {
            using (var dbContext = new vegaEntities())
            using (var transaction = dbContext.Database.BeginTransaction())
            {
                for (int i = 0; i < Request.Files.Count; i++)
                {
                    HttpPostedFileBase file = Request.Files[i];

                    if (file.ContentLength > 0)
                    {
                        FileAttachment fileAttachment = new FileAttachment
                        {
                            Id = Guid.NewGuid(),
                            FileName = file.FileName,
                            ContentType = file.ContentType,
                            DateAdded = DateTime.UtcNow
                        };
                        // Load content
                        fileAttachment.Content = new byte[file.ContentLength];
                        file.InputStream.Read(fileAttachment.Content, 0, file.ContentLength);
                        // Add to database
                        dbContext.FileAttachments.Add(fileAttachment);
                        // Add to results
                        files.Add(new FileAttachmentFileModel
                        {
                            id = fileAttachment.Id.ToString(),
                            name = file.FileName,
                            size = file.ContentLength.FormatAsFileSize(),
                            //action = FileAttachmentFileModel.AddAction
                        });
                    }
                }
                dbContext.SaveChanges();
                transaction.Commit();
            }
        }
    }
    catch (Exception ex)
    {
        // TODO:
        return Json(new { message = ex.Message });
    }
    return Json(new { files = files });
}

此代码适用于较小的文件。我的 C# 方法被调用,文件被检索,progressall 处理程序被调用,显示 100%。

问题是当我尝试上传一个大文件时(progressall 处理程序被多次调用)。在这种情况下,处理程序会按照预期将进度值递增到 100% 来调用。但是我的 C# 方法永远不会被调用,并且浏览器会报告以下错误。

POST http://localhost:1290/File/AddAttachment 404(未找到)

我对这个错误感到困惑,因为 C# 方法在两种情况下都是相同的。为什么它在一个中找到而在另一个中找不到。我认为问题是我的控制器方法需要一个完整的文件,而我必须编写代码来处理分块上传。这是正确的吗?谁能指点我有关如何使用 C#/MVC 编写上传处理程序的文档?

【问题讨论】:

  • 您使用的是哪个版本的 MVC 和 .NET?
  • @MasterYoda:现在,我正在使用 Visual Studio 2015 附带的那些,但如果有理由可以升级。那会有什么不同吗?
  • 可能差别不大,我认为您可能正在使用基于您的 VS 版本的 .net 4.5 - 4.6。在使用 asp.net 之前,我已经通过使用 Stream、BinaryReader 和 Byte 数组序列化整个文件来完成此操作。在这里查看我的问题:stackoverflow.com/questions/17233884/…。除了我逐行读取文件并将每一行导出到数据库中的映射之外,我还使用类似的文件上传控件对多种文件类型进行了类似的操作。给我一点时间,我会看看我能不能把它挖出来:)
  • @MasterYoda:看起来你在做一些完全不同的事情。例如,您似乎使用的是 WebForms 而不是 MVC。其次,我可以告诉您,您似乎没有使用 AJAX。也许最大的不同是您似乎没有使用我正在尝试使用的 jQuery 文件上传组件。
  • 是的,没错,但我不建议您逐行复制整个示例,我只是建议您将文件序列化为流并从那里开始。无论如何,您都不能使用我的示例,因为它使用 Telerik AJAX 控件来上传文档。我认为您使用的文件上传控件没有问题,我认为它可能更多地与它如何处理服务器端有关

标签: c# jquery ajax asp.net-mvc jquery-file-upload


【解决方案1】:

该死!这是超出最大文件大小的问题。我知道这个。我以前处理过。但是我对 404 错误感到困惑!哦!

【讨论】:

  • 那么为什么它返回 404 而不是更有意义的东西?
  • 是的,这就是我想知道的。
  • 这里有类似的问题:stackoverflow.com/q/4731295/5311735。当请求大小超过 maxAllowedContentLength 时,您可以看到 IIS 返回 404.13。如果你列出了很多答案,你可以找到一个描述如何将这个特定错误(404 和子代码 13)重定向到你的 mvc 控制器,它可以提供更有意义的描述。
【解决方案2】:

其实有一个触发器,依赖于不正确打开高文件而不是在它的基础上下载的。

404 错误取决于 IIS 安全协议

如果你要检查Request和Response的细节,你可以自己看

我不建议由 IIS 管理员解决。

如果您将在应用程序级别设置它

web.config 中的示例;

<System.webServer>
    <Security>
      <RequestFiltering>
        <requestLimits maxAllowedContentLength = "30000000" />
      </ requestFiltering>
    </ security>
  </system.webServer>

【讨论】:

  • 我不明白你在说什么。触发器是什么意思?
  • @JonathanWood 文件未按实际大小下载,则此文件正在尝试打开。在这种情况下,IIS 正在使安全协议生效
猜你喜欢
  • 2012-01-18
  • 1970-01-01
  • 1970-01-01
  • 2018-11-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多