上传图片 asp.net Core

Posted

技术标签:

【中文标题】上传图片 asp.net Core【英文标题】:uploading image asp.net Core 【发布时间】:2018-04-17 22:29:07 【问题描述】:

我是 ASP.net COre 的新手,我想上传一个文件(图像)并将其存储在一个特定的文件夹中。我一直在关注这个 tuto (File uploads in ASP.NET Core) 但我不知道如何将它存储在刚刚上传到服务器上的文件中 这是html

<form method="post" enctype="multipart/form-data" asp-controller="UploadFiles" asp-action="Index">
<div class="form-group">
    <div class="col-md-10">
        <p>Upload one or more files using this form:</p>
        <input type="file" name="files" multiple />
    </div>
</div>
<div class="form-group">
    <div class="col-md-10">
        <input type="submit" value="Upload" />
    </div>
</div>

这是控制器

[HttpPost("UploadFiles")]
public async Task<IActionResult> Post(List<IFormFile> files)

long size = files.Sum(f => f.Length);

// full path to file in temp location
var filePath = Path.GetTempFileName();

foreach (var formFile in files)

    if (formFile.Length > 0)
    
        using (var stream = new FileStream(filePath, FileMode.Create))
        
            await formFile.CopyToAsync(stream);
        
    


// process uploaded files
// Don't rely on or trust the FileName property without validation.

return Ok(new  count = files.Count, size, filePath);

这是我正在使用的课程

public interface IFormFile

string ContentType  get; 
string ContentDisposition  get; 
IHeaderDictionary Headers  get; 
long Length  get; 
string Name  get; 
string FileName  get; 
Stream OpenReadStream();
void CopyTo(Stream target);
Task CopyToAsync(Stream target, CancellationToken cancellationToken = null);

我只需要将图像存储在如下文件夹中:C:\Users\DESKTOP-1603\Desktop\GestionSyndic\GestionSyndic\src\WebApplication1\wwwroot\images\ 并更改图像的名称谢谢:D

【问题讨论】:

我们使用IFormFile.OpenReadStream() 和 ImageSharp 来验证它是一个真实的图像文件。如果你不需要这个,你可以使用这个:***.com/questions/411592/… 您的意思是“将其存储在文件中?您的意思是,您要将其存储在应用根目录中的特定文件夹中吗? 对不起,我的意思是我的应用根目录中的文件夹 【参考方案1】:

通过简单的步骤在 ASP.NET Core MVC 中上传文件

1.Demo.cshtml查看代码sn-p

<form method="post" enctype="multipart/form-data" asp-controller="Demo" asp-action="Index">
<div class="form-group">
    <div class="col-md-10">
        <p>Upload one or more files using this form:</p>
        <input type="file" name="files" multiple />
    </div>
</div>
<div class="form-group">
    <div class="col-md-10">
        <input type="submit" value="Upload" />
    </div>
</div>

    演示控制器

为了展示演示,我创建了一个演示控制器,其中包含 2 个操作方法,一个用于处理获取请求,另一个用于处理发布请求。

using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.Mvc;
using System;
using System.IO;
using System.Net.Http.Headers;

namespace WebApplication6.Controllers

    public class DemoController : Controller
    
        private readonly IHostingEnvironment _environment;

        // Constructor
        public DemoController(IHostingEnvironment IHostingEnvironment)
        
            _environment = IHostingEnvironment;
        

        [HttpGet]
        public IActionResult Index()
        
            return View();
        

        [HttpPost]
        public IActionResult Index(string name)
        
            var newFileName = string.Empty;

            if (HttpContext.Request.Form.Files != null)
            
                var fileName = string.Empty;
                string PathDB = string.Empty;

                var files = HttpContext.Request.Form.Files;

                foreach (var file in files)
                
                    if (file.Length > 0)
                    
                        //Getting FileName
                        fileName = ContentDispositionHeaderValue.Parse(file.ContentDisposition).FileName.Trim('"');

                        //Assigning Unique Filename (Guid)
                        var myUniqueFileName = Convert.ToString(Guid.NewGuid());

                        //Getting file Extension
                        var FileExtension = Path.GetExtension(fileName);

                        // concating  FileName + FileExtension
                        newFileName = myUniqueFileName + FileExtension;

                        // Combines two strings into a path.
                        fileName = Path.Combine(_environment.WebRootPath, "demoImages") + $@"\newFileName";

                        // if you want to store path of folder in database
                        PathDB = "demoImages/" + newFileName;

                        using (FileStream fs = System.IO.File.Create(fileName))
                        
                            file.CopyTo(fs);
                            fs.Flush();
                        
                    
                


            
            return View();
        
    

调试时的快照

存储图像的文件夹位置

【讨论】:

感谢您的回复我现在面临的问题是我已经添加了此代码,我只能在控制器中提交模型不再提交的照片 问题是我没有收到任何错误传递给控制器​​的模型只是 null 这里是整个问题***.com/questions/47319242/… 此代码不可移植,反斜杠仅适用于 Windows,始终使用 Path.Combine():path += $@"\newFileName"; // wrong way 此代码有效,但更新 fileName 时除外。这条线在 mac 上适用于我:fileName = Path.Combine(_environment.WebRootPath, "uploadImages") + $@"/newFileName";【参考方案2】:

你应该注入IHostingEnvironment,这样你就可以获得网络根(默认为wwwroot)位置。

public class HomeController : Controller

    private readonly IHostingEnvironment hostingEnvironment;
    public HomeController(IHostingEnvironment environment)
    
        hostingEnvironment = environment;
    
    [HttpPost]
    public async Task<IActionResult> UploadFiles(List<IFormFile> files)
    
        long size = files.Sum(f => f.Length);

        // full path to file in temp location
        var filePath = Path.GetTempFileName();

        foreach (var formFile in files)
        
            var uploads = Path.Combine(hostingEnvironment.WebRootPath, "images");
            var fullPath = Path.Combine(uploads, GetUniqueFileName(formFile.FileName));
            formFile.CopyTo(new FileStream(fullPath, FileMode.Create));

        
        return Ok(new  count = files.Count, size, filePath );
    
    private string GetUniqueFileName(string fileName)
    
        fileName = Path.GetFileName(fileName);
        return  Path.GetFileNameWithoutExtension(fileName)
                  + "_" 
                  + Guid.NewGuid().ToString().Substring(0, 4) 
                  + Path.GetExtension(fileName);
    

这会将文件保存到wwwroot 中的images 目录中。

确保您的表单标签的action 属性设置为HomeController(/Home/UploadFiles) 的UploadFiles 操作方法

<form method="post" enctype="multipart/form-data" asp-controller="Home"
                                                  asp-action="UploadFiles">
    <div class="form-group">
        <div class="col-md-10">
            <p>Upload one or more files using this form:</p>
            <input type="file" name="files" multiple />
        </div>
    </div>
    <div class="form-group">
        <div class="col-md-10">
            <input type="submit" value="Upload" />
        </div>
    </div>
</form>

我不太确定你为什么要从这里返回 Ok 结果。您可能会将重定向结果返回到列表页面。

【讨论】:

【参考方案3】:

刚刚使用了来自@Saineshwar 的公认答案,但做了一些重构作为一种扩展方法,以便于使用 IFromFile

public static string MakeFileUniqueName(this IFormFile formFile)
    
        if (formFile.Length > 0)
        
            string fileName =
                ContentDispositionHeaderValue.Parse(formFile.ContentDisposition).FileName.Trim('"');

            // concatinating  FileName + FileExtension
            return Guid.NewGuid() + Path.GetExtension(fileName);      
        

        return string.Empty;
    

【讨论】:

以上是关于上传图片 asp.net Core的主要内容,如果未能解决你的问题,请参考以下文章

上传图片并在 asp.net core mvc 中显示

如何上传个人资料图片并在身份 asp.net core 3 中更新

asp.net4.0中多图片上传如何操作

在ASP.NET Core 中上传文件

asp.net上传图片

asp.net如何上传图片