首页 > 解决方案 > 为什么新图像不可用?

问题描述

我正在开发一个使用图像的系统。在wwwroot我创建了一些文件夹并将默认图像放在那里。我在启动项目时也实现了它的注册。创建帐户时,我将其绑定到每个用户。此图像在网站上正常显示。但是当我尝试上传新图像时,浏览器说它不可用(404)。虽然它是在与默认图像相同的目录中创建的。成功创建数据库记录,并且新图像与用户配置文件正确关联。在检查页面并检查图像的 url 时,我看到它已正确生成。名称和扩展名是正确的。我采用相同的url,将无法访问的文件名改为默认,浏览器加载默认图片。我尝试上传一个名字的小图片(我怀疑问题出在文件名中的字符上)。重新启动了服务器。没有任何帮助。

Startup.cs

public class Startup
{
    public Startup(IConfiguration configuration)
    {
        Configuration = configuration;
    }

    public IConfiguration Configuration { get; }

    public void ConfigureServices(IServiceCollection services)
    {
        // ...
    }

    public void Configure(IApplicationBuilder app, IWebHostEnvironment env, IServiceProvider serviceProvider, IConfiguration config)
    {
        //...
        app.UseDefaultFiles();
        app.UseStaticFiles();

        app.UseRouting();

        app.UseEndpoints(endpoints =>
        {
            endpoints.MapControllerRoute(
                name: "default",
                pattern: "{controller=Home}/{action=Index}/{id?}");
            endpoints.MapRazorPages();
        });

        CreateDefaultImages(serviceProvider);
    }

    private void CreateDefaultImages(IServiceProvider serviceProvider)
    {
        var dbContext = serviceProvider.GetRequiredService<ApplicationDbContext>();
        var userSettings = serviceProvider.GetRequiredService<IOptions<UserSettings>>();
        var defaultProfilePicture = userSettings.Value.DefaultProfilePicture;
        var img = dbContext.Images.Where(i => i.Filename == defaultProfilePicture).FirstOrDefault();
        
        if(img == null)
        {
            var defaultImage = new Image { Filename = defaultProfilePicture };
            dbContext.Images.Add(defaultImage);
            dbContext.SaveChanges();
        }
    }
}

在文件系统上创建文件

public class ImagesManager
{
    private readonly IWebHostEnvironment _environment;
    private readonly string _imagesStorage;

    public ImagesManager(IWebHostEnvironment environment)
    {
        _environment = environment;
        _imagesStorage = Path.Combine(_environment.WebRootPath, "Resources", "Images");
    }

    public async Task<Image> CreateAsync(IFormFile file)
    {
        Image createdImage = null;

        try
        {
            string fileName = GenerateUniqueFileName(file.FileName);
            string filePath = Path.Combine(_imagesStorage, fileName);

            using (var fileStream = new FileStream(filePath, FileMode.Create))
            {
                await file.CopyToAsync(fileStream);
            }

            createdImage = new Image
            {
                Filename = fileName
            };
        }
        catch { }

        return createdImage;
    }

    // other methods ...
}

简而言之,如果错过了控制器,创建视图模型,并在页面上使用该模型,一切都归结为这段代码

string pathToProfilePicture = $"{Request.Scheme}://{Request.Host.Value}/Resources/Images/{Model.PathToProfilePicture}";
<img src="@pathToProfilePicture">

标签: c#.netiisasp.net-core-3.1

解决方案


推荐阅读