繁体   English   中英

使用asp.net web api检查上传的文件是否为图像

[英]Check uploaded file is a image or not using asp.net web api

我想检查上传的文件是图像还是不使用 asp.net web api。 我从客户端向 Web API 发送一个 JSON 字符串对象。 我可以从服务器端读取上传文件的数据,就像“ \\JFIF\\\\\H\H\\ ”

像这样的Javascript代码:

       var file = document.getElementById("UploadFile").files[0];

        if (file) {

            var fileReader = new FileReader();

            fileReader.readAsText(file, "UTF-8");

            fileReader.onload = function (evt) {

                $scope.BookingForm.Extension.FileContent = fileReader.result;

                $scope.BookingForm.Extension.FileName = file.name;
                $scope.BookingForm.Extension.FileSize = file.size;

fileReader.result 是文件的数据。 这是将数据发布到 Web api 的 ajax 代码。

    var fromdata = JSON.stringify($scope.BookingForm);
    var requestUrl = "/webapp/api/onlineform/PostOnlineForm"
    return $http({
        method: 'POST',
        url: requestUrl,
        data: fromdata,
        headers: {
            "Content-Type": "application/json; odata=verbose"
        }
    });

这是服务器端的功能:

public async Task<IHttpActionResult> PostOnlineForm(OnlineForm formData)
        {
            Newtonsoft.Json.Linq.JObject extensionObj = Newtonsoft.Json.Linq.JObject.Parse(formData.Extensions);
            var dataOfFile = extensionObj["FileContent"].ToString();

            // code here

        } 

变量“dataOfFile”是上传文件的字符串数据。 我想检查变量“dataOfFile”是否是图像。 非常感谢你。

检查文件的文件签名(以下代码IsImage()检查 BMP、GIF、PNG、TIFF、JPEG)

public static class Extensions
{
    public static bool IsImage(this byte[] fileBytes)
    {
        if (fileBytes.Length < 2)
        {
            return false;
        }

        var headers = new List<byte[]>
        {
            new byte[] { 0x42, 0x4D }, // BMP
            new byte[] { 0x47, 0x49, 0x46, 0x38, 0x37, 0x61 }, // GIF
            new byte[] { 0x47, 0x49, 0x46, 0x38, 0x39, 0x61 }, // GIF
            new byte[] { 0x89, 0x50, 0x4e, 0x47, 0x0D, 0x0A, 0x1A, 0x0A }, // PNG
            new byte[] { 0x49, 0x49, 0x2A, 0x00 }, // TIFF
            new byte[] { 0x4D, 0x4D, 0x00, 0x2A }, // TIFF
            new byte[] { 0xFF, 0xD8, 0xFF }, // JPEG
            new byte[] { 0xFF, 0xD9 }, // JPEG
        };

        return headers.Any(x => x.SequenceEqual(fileBytes.Take(x.Length)));
    }
}

您的服务器端功能将成为

public async Task<IHttpActionResult> PostOnlineForm(OnlineForm formData)
{
    Newtonsoft.Json.Linq.JObject extensionObj = Newtonsoft.Json.Linq.JObject.Parse(formData.Extensions);
    var dataOfFile = extensionObj["FileContent"].ToString();
    
    // get first 8 bytes        
    int length = Math.Min(8, Encoding.UTF8.GetByteCount(dataOfFile));
    byte[] fileBytes = Encoding.UTF8.GetBytes(dataOfFile, 0, length); 

    bool isImage = fileBytes.IsImage();
} 

顺便说一下,在 json body 中发布文件内容并不是上传文件的最佳方式。 考虑文件上传方案

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM