【发布时间】: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