【问题标题】:asp.net file upload check always returning invalid MIME typeasp.net 文件上传检查总是返回无效的 MIME 类型
【发布时间】:2015-10-13 19:31:36
【问题描述】:

我有一个显示用户头像的用户个人资料页面,并允许他们上传新头像。

当用户点击上传时,我想在决定是否上传之前检查发布文件的MIME类型。

这都包含在父配置文件页面中的用户控件中。

我的用户控件:

    <asp:ImageButton ID="imgAvatar" runat="server" OnClick="imgAvatar_Click" /> 
    <asp:FileUpload ID="fluFileUpload" runat="server" AllowMultiple="false" /> 
    <asp:Button ID="btnFileUpload" runat="server" Text="Upload" OnClick="btnFileUpload_Click" /> 
    <asp:Button ID="btnCancelUpload" runat="server" Text="Cancel" OnClick="btnCancelUpload_Click" />

我的上传按钮代码在后面:

    protected void btnFileUpload_Click(object sender, EventArgs e)
{
    if(fluFileUpload.HasFile)
    {
        HttpPostedFile avatar = fluFileUpload.PostedFile;
        bool validmime = validUpload(avatar);
        if (validmime)
        {
            //handling valid upload
        }
        else
        {
            //handling invalid upload
        }
    }
    else
    {
        //handling no file
    }
}

用于检查 MIME 类型的处理程序:

    [DllImport(@"urlmon.dll", CharSet = CharSet.Auto)]
    private extern static System.UInt32 FindMimeFromData(System.UInt32 pBC,
        [MarshalAs(UnmanagedType.LPStr)] System.String pwzUrl,
        [MarshalAs(UnmanagedType.LPArray)] byte[] pBuffer,
        System.UInt32 cbSize, [MarshalAs(UnmanagedType.LPStr)] System.String pwzMimeProposed,
        System.UInt32 dwMimeFlags,
        out System.UInt32 ppwzMimeOut,
        System.UInt32 dwReserverd);
    public static bool validUpload (HttpPostedFile postedFile)
    {
        HttpPostedFile file = postedFile;
        byte[] document = new byte[file.ContentLength];
        file.InputStream.Read(document, 0, file.ContentLength);
        System.UInt32 mimetype;
        FindMimeFromData(0, null, document, 256, null, 0, out mimetype, 0);
        System.IntPtr mimeTypePtr = new IntPtr(mimetype);
        string mime = Marshal.PtrToStringUni(mimeTypePtr);
        Marshal.FreeCoTaskMem(mimeTypePtr);

        if (mime == "image/png" || mime == "image/jpeg" || mime == "image/pjpeg")
        {
            //file is valid  
            return true;
        }
        else
        {
            //file is invalid  
            return false;
        }
    }
}

不幸的是,即使我知道它是有效的,这也会返回一个无效的 MIME 类型(即我正在上传一个有效的 .png 图像但得到一个无效的返回)

对我哪里出错有什么建议吗?

【问题讨论】:

    标签: c# asp.net file-upload


    【解决方案1】:

    根据 FindMimeFromData 的文档 (MSDN):

    将文件从客户端上传到 Web 服务器时,Windows Internet Explorer 使用 FindMimeFromData 来确定 MIME 类型。 在可能的情况下,FindMimeFromData 从 已知 MIME 类型的列表,而不是依赖于 MIME 类型值 与系统注册表中的文件扩展名相关联。在 在某些情况下,检测到的 MIME 类型可能与通常的不同 向后兼容的可接受值,如下所示 表:

    标准 MIME 类型FindMimeFromData 返回 图片/jpeg 图片/pjpeg 图片/png 图片/x-png

    我建议也检查 mime == "image/x-png"。

    【讨论】:

    • 太棒了,这就是答案 - 我从一个以 ".x-png" 作为文件扩展名但仍然具有 mime 类型为 "image/png" 的列表中获得了类型。已将“image/x-png”添加为要检查的 mime 类型,并且可以正常工作。非常感谢您的帮助
    猜你喜欢
    • 1970-01-01
    • 2014-02-20
    • 2013-08-13
    • 2011-08-06
    • 2011-11-15
    • 2013-02-22
    • 2018-11-07
    • 2011-09-22
    • 2021-08-09
    相关资源
    最近更新 更多