c# - 为什么新图像不可用?
问题描述
我正在开发一个使用图像的系统。在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">
解决方案
推荐阅读
- python - 将值从 HTML 页面传递到烧瓶应用程序以实现数据库连接
- sql - 权限错误 - 创建数据库链接 Oracle
- regex - 如何在postgresql中提取电子邮件最后一个'@'字符之前的部分?
- spreadsheet - Excel 2013 中的条件格式
- php - 准确比较来自不同时区的日期与归零时间
- laravel - Laravel Auth::guard('api')->user() 返回 null
- ionic-framework - Linux问题下的Ionic Android构建
- node.js - Node.js 环境中的水平缩放和 GraphQL
- javascript - 通过html将js变量发送到php文件
- javascript - 无法使用 Google Api 按距离排序结果