c# - 上传前 C# 过滤文件扩展名
问题描述
以前我使用PHP。然后我得到了一个基于 C# 的项目,但我不知道该怎么做。即使我试图打印一些东西,但它总是错误构建。
下面是(我认为,因为我在Controller目录中找到了这个文件)上传文件控制器,我想限制,以便只能上传图片。任何人都可以帮忙吗?
public IActionResult UploadFile ([FromForm] IFormFile file, [FromForm] string fileName) {
return Ok (new {
id = _fileService.UploadFile (fileName, file),
fileName = file.FileName,
fileSize = file.Length,
fileType = file.ContentType,
file = file
});
}
解决方案
(仅供参考,在您更改任何内容之前,我会确保您已经验证过的代码可以正常工作。)
如果您尝试限制可以上传的文件类型,您应该能够检查文件类型(内容类型)或扩展名。
ContentType 应该类似于“image/png”或“image/jpeg”。你可以在网上找到图像类型的列表,我发现这个答案有很多常见的:https ://stackoverflow.com/a/14587821/13734398
要检查扩展名,我相信您可以使用Path.GetExtension解析这样的文件名:
var extension = Path.GetExtension(file.FileName);
(路径来自 System.IO 命名空间。使用System.IO.Path...
或添加using System.IO;
到 C# 文件的顶部)
例如,您可以检查“.png”或“.jpeg”的扩展名。
客户端检查
哦,你的问题提到了“上传之前”。从技术上讲,此时文件已经上传。如果您试图限制上传的内容,您可以在上传表单中添加一些客户端检查。请注意,它不是防弹的,您仍然需要像我上面提到的那样检查服务器端。
其他建议
就个人而言,我建议您也稍微重构一下您的代码。这是我要让它看起来的样子:
public IActionResult UploadFile ([FromForm] IFormFile file, [FromForm] string fileName)
{
var fileId = _fileService.UploadFile(fileName, file);
return Ok (new {
id = fileId,
fileName = file.FileName,
fileSize = file.Length,
fileType = file.ContentType,
// Removing this from the Response.
// Probably don't need to send the file back.
// file = file
});
}
我认为如果出现问题,这将为您提供更好的错误消息UploadFile()
。(对我来说)事情的顺序/顺序也更清楚了。
推荐阅读
- sql - 使用 OpenX SerDe 在 Athena 中聚合 JSON 对象自己的键值属性
- entity-framework - 使用 Entity Framework Core Fluent API,如何阻止它创建自动递增的主键?
- javascript - webauthn yubico 示例不适用于 Firefox
- python - 如何在 pandas 中打开 csv 文件,显示所有列而不是仅在一列中显示整个数据?
- python - 我正在尝试标准化我的属性,但我收到标准缩放器错误,因为 Python 找不到它
- java - 由于巨大的休眠持续时间,超过了 GC 开销限制
- ansible - Ansible 嵌套的 host_vars 文件夹
- java - 按子对象中参数的值查询dsl顺序
- android - LiveData“按引用传递”初始值
- java - Spring boot 和 JPA 覆盖映射的实体名称/id