【问题标题】:MVC 6 HttpPostedFileBase?MVC 6 HttpPostedFileBase?
【发布时间】:2015-04-23 23:49:31
【问题描述】:

我正在尝试使用MVC 6 上传图片;但是,我找不到课程HttpPostedFileBase。我检查了GitHub 并没有任何运气。有谁知道在MVC6上传文件的正确方法吗?

【问题讨论】:

  • 我在这里浪费了一整天的时间来解决同样的问题。

标签: asp.net-core-mvc httppostedfilebase


【解决方案1】:

MVC 6 使用了另一种机制来上传文件。您可以在 GitHubother sources 上获得更多示例。只需使用 IFormFile 作为您的操作或文件集合的参数,如果您想同时上传几个文件,请使用 IFormFileCollection

public async Task<IActionResult> UploadSingle(IFormFile file)
{
    FileDetails fileDetails;
    using (var reader = new StreamReader(file.OpenReadStream()))
    {
        var fileContent = reader.ReadToEnd();
        var parsedContentDisposition = ContentDispositionHeaderValue.Parse(file.ContentDisposition);
        var fileName = parsedContentDisposition.FileName;
    }
    ...
}

[HttpPost]
public async Task<IActionResult> UploadMultiple(ICollection<IFormFile> files)
{
    var uploads = Path.Combine(_environment.WebRootPath,"uploads"); 
    foreach(var file in files)
    {
        if(file.Length > 0)
        {
            var fileName = ContentDispositionHeaderValue.Parse(file.ContentDisposition).FileName.Trim('"');
            await file.SaveAsAsync(Path.Combine(uploads,fileName));
        }
        ...
    }
}

您可以在asp.net sources 中查看IFormFile 的当前合约。有关其他文件信息,另请参阅 ContentDispositionHeaderValue

【讨论】:

  • 我正在尝试将图像转换为字节数组,但流读取器对象中没有 readbytes 或等效方法。由于 ifileform 对象没有输入流属性,二进制阅读器现在无法正常工作
  • @RachitGupta 你的方案是什么?为什么需要将图像转换为byte[]。你实际使用的是什么类型?希望下一个链接对您有所帮助。 stackoverflow.com/questions/3801275/…
  • 您可以通过提及需要哪些“使用”以及是否需要项目引用来改进此答案 - 因为 dotnetcore 默认情况下不包含很多内容,并且必须明确添加。也许 Visual Studio 会自动添加正确的引用,但 Visual Studio Code 不能。
【解决方案2】:

MVC6 中没有HttpPostedFileBase。您可以改用IFormFile

示例:https://github.com/aspnet/Mvc/blob/dev/test/WebSites/ModelBindingWebSite/Controllers/FileUploadController.cs

来自上述链接的片段:

public FileDetails UploadSingle(IFormFile file)
{
    FileDetails fileDetails;
    using (var reader = new StreamReader(file.OpenReadStream()))
    {
        var fileContent = reader.ReadToEnd();
        var parsedContentDisposition = ContentDispositionHeaderValue.Parse(file.ContentDisposition);
        fileDetails = new FileDetails
        {
            Filename = parsedContentDisposition.FileName,
            Content = fileContent
        };
    }

    return fileDetails;
}

【讨论】:

  • 我正在使用 Beta 7,但是当 ajax 请求时,我得到 IFormFile 为空。在我的情况下也找不到 FileDetails .. 你会指导。
【解决方案3】:

我搜索了很长一段时间,试图在 .net 核心中将其拼凑起来,最终得到以下结果。接下来将进行 Base64 转换,以便检索和显示更容易一些。我使用 IFormFileCollection 来处理多个文件。

[HttpPost]
    public async Task<IActionResult> Create(IFormFileCollection files)
    {

        Models.File fileIn = new Models.File();
        if(model != null && files != null)
        {
            foreach (var file in files)
            {
                if (file.Length > 0)
                {
                  var fileName = ContentDispositionHeaderValue.Parse(file.ContentDisposition).FileName.Trim('"');

                        byte[] fileBytes = null;
                        using (var fileStream = file.OpenReadStream())
                        using (var ms = new MemoryStream())
                        {
                            fileStream.CopyTo(ms);
                            fileBytes = ms.ToArray();
                            //string s = Convert.ToBase64String(fileBytes);
                            // act on the Base64 data
                        }


                        fileIn.Filename = fileName;
                        fileIn.FileLength = Convert.ToInt32(file.Length);
                        fileIn.FileType = file.ContentType;
                        fileIn.FileTypeId = model.FileTypeId;
                        fileIn.FileData = fileBytes;
                        _context.Add(fileIn);
                        await _context.SaveChangesAsync();
                }
            }
        }
        return View();
    }

编辑

下面是将文件返回到列表然后下载。

public JsonResult GetAllFiles()
    {

        var files = _context.File
            .Include(a => a.FileCategory)
            .Select(a => new
            {
                id = a.Id.ToString(),
                fileName = a.Filename,
                fileData = a.FileData,
                fileType = a.FileType,
                friendlyName = a.FriendlyName,
                fileCategory = a.FileCategory.Name.ToLower()
            }).ToList();

       return Json(files);
    }

    public FileStreamResult DownloadFileById(int id)
    {
        // Fetching file encoded code from database.
        var file = _context.File.SingleOrDefault(f => f.Id == id);
        var fileData = file.FileData;
        var fileName = file.Filename;

        // Converting to code to byte array
        byte[] bytes = Convert.FromBase64String(fileData);

        // Converting byte array to memory stream.
        MemoryStream stream = new MemoryStream(bytes);

        // Create final file stream result.
        FileStreamResult fileStream = new FileStreamResult(stream, "*/*");

        // File name with file extension.
        fileStream.FileDownloadName = fileName;
        return fileStream;
    }

【讨论】:

  • 另一种选择:public async Task Create(),然后可以通过以下方式获取文件:var files = HttpContext.Request.Form.Files;
  • 我试图编辑我上面的评论,但 SOF 说我超过了 5 分钟。这里还有一个选项:public JsonResult Create(),然后可以通过以下方式获取文件:var files = HttpContext.Request.Form.Files;这两个选项都可以将多个文件发送到服务器。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-12
  • 2019-09-17
  • 1970-01-01
  • 2013-09-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多