【问题标题】:Upload file ASP.NET 5上传文件 ASP.NET 5
【发布时间】:2015-04-18 21:09:55
【问题描述】:

我正在尝试在 ASP.NET 5 中上传文件,但我在互联网上看到的两种方式都失败了。 使用 XMLHttpRequest 这是我的服务器端代码:

 public async Task<ActionResult> UploadSWF()
 {
     StreamReader reader = new StreamReader(Request.Body);
     var text = await reader.ReadToEndAsync();
     return View();
 }

[EDIT 1]:我的客户端:

var client = new XMLHttpRequest();
function upload() 
{
   var file = document.getElementById("uploadfile");
   var formData = new FormData();
   formData.append("upload", file.files[0]);
   client.open("post", "/Home/UploadSWF", true);
   //client.setRequestHeader("Content-Type", "multipart/form-data");
   client.setRequestHeader("Content-Type", "application/x-shockwave-flash");
   client.send(formData);
}

但我唯一能从中得到的是:

------WebKitFormBoundaryX1h5stVbtaNe6nFw 内容处置:表单数据;名称="上传";文件名="数据.swf" 内容类型:应用程序/x-shockwave-flash CWS ;"

[EDIT 2]:这是我得到这个的代码:

 public ActionResult UploadSWF()
    {
        Stream bodyStream = Context.Request.Body;
        var sr = new StreamReader(bodyStream);
        var test = sr.ReadToEnd();
        return View();
    }

所以我得到了文件的名称和内容类型,但没有得到它的内容。

这个答案https://stackoverflow.com/a/26445416/1203116 正在将流复制到一个文件中,但是文件创建部分对我不起作用,我不知道发生了什么但没有任何反应。所以我尝试对 MemoryStream 做同样的事情,但我得到了一个空字符串。

所以最后我尝试了另一种方法,使用 IFormFile 如下所示:https://github.com/aspnet/Mvc/blob/437eb93bdec0d9238d672711ebd7bd3097b6537d/test/WebSites/ModelBindingWebSite/Controllers/FileUploadController.cs 这个接口应该在我已经添加到我的项目中的 Microsoft.AspNet.Http 中,但我仍然无法访问它。我在这个命名空间中看不到任何 IFormFile。

[编辑 1]:我尝试的第一种方法是使用 HttpPostedFileBase,就像我在 ASP.NET MVC 5 中使用的那样,但它在我的 vNext 项目中不起作用。我总是得到一个 MissingMethodException。 我在客户端的代码是:

<form action="/home/UploadSWF" method="POST" enctype="multipart/form-data">
        <input type="file" name="file" accept=".swf, application/x-shockwave-flash/*">
        <input type="submit" name="submit" />
    </form>

在我的控制器中:

public ActionResult UploadSWF(HttpPostedFileBase file)
{
     return View();
}

【问题讨论】:

  • 不确定是否有帮助,但尝试将 HttpPostedFileBase 上传参数放到 UploadSWF 中,看看它是否不为空。
  • 我曾经试过这个。实际上这是我想实现的第一种方式,但我总是得到一个 MissingMethodException。请求无法到达带有经典
    的方法控制器。在我原来的 ASP.NET MVC 5 项目中,它运行良好。所以我试图为我的 vNext 项目寻找其他东西......
  • 也许您也应该添加您的发布代码。
  • 我花了很多时间试图弄清楚为什么我的 IFormFile 对象在我的 ASP.Net 5 OnPost() 方法中为“null”。没有错误,没有警告......也没有要上传的文件。解决方案:我忘记在
    元素中添加 enctype="multipart/form-data"

标签: c# asp.net .net asp.net-core


【解决方案1】:

IFormFile 是作为 beta3 版本的一部分引入的。您可能有过时的软件包。检查您的 project.json 并确保您使用的是 beta3(或更新的)软件包。

【讨论】:

  • 我在 Nuget 上只能看到 Beta2 nuget.org/packages/Microsoft.AspNet.Http/1.0.0-beta2 我如何获得这个 Beta3?
  • 哈好吧,我只是通过更改我的 project.json 并没有得到它,即使 Nuget 没有显示它,它也会自动获取最新的。谢谢阿杰
  • 无法在 Beta3 中正常工作。我觉得还为时过早。你知道如何处理 XmlHttpRequest 吗?
  • 我可以看到您正在为文件使用名称“上传”。您在操作中使用相同的名称吗?
  • 使用 IFormFile 我有一个异常,所以我想我还必须将 Microsoft.AspNet.PipelineCore Beta3 添加到我的项目中,但结果是错误 500。名称“上传”是我使用的名称XmlHttpRequest 方法。我可以获得有关文件的信息,例如其名称或长度,但我完全不知道如何访问其内容。没有我可以使用的 Request.File 或 Request.Files...
猜你喜欢
  • 1970-01-01
  • 2014-05-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-24
  • 2011-03-11
  • 2011-04-04
相关资源
最近更新 更多