仅上传文档文件
Posted
技术标签:
【中文标题】仅上传文档文件【英文标题】:upload only document files 【发布时间】:2013-11-26 11:06:33 【问题描述】:我正在尝试上传文件。用户可以上传 ri 文件,但他/她可以上传图片而不是文件,我想限制这个如何应用条件这是我的上传代码
if (FileUploadControl.PostedFile != null &&
FileUploadControl.PostedFile.ContentLength
> 0)
if
(FileUploadControl.FileContent.Length < 100000)
string filename =
Path.GetFileName(FileUploadControl.PostedFile.FileName);
string folder = Server.MapPath("~/Docfiles/");
Directory.CreateDirectory(folder);
FileUploadControl.PostedFile.SaveAs(Path.Combine(folder, filename));
try
cc.upload1(Txt_docde.Value, txt_dname.Value,
FileUploadControl.FileName, Convert.ToInt32(Docdrop.SelectedValue),
Convert.ToInt32(DropDownList2.SelectedValue),
Convert.ToString(Session["Login2"]),Convert.ToInt32(Session["UserID"]));
StatusLabel.ForeColor = System.Drawing.Color.Green;
//StatusLabel.ForeColor = System.Drawing.FontStyle.Bold;
StatusLabel.Text = "Success";
catch
StatusLabel.ForeColor = System.Drawing.Color.Red;
Label2.Text = "Failed";
else
StatusLabel.ForeColor = System.Drawing.Color.Red;
Label2.Text = "File Size to big";
【问题讨论】:
【参考方案1】:制作您希望允许的扩展名的通用列表,然后检查您尝试上传的文件是否满足该扩展名要求。
var allowedExtensions = new string[] "doc", "docx", "pdf" ;
var extension = Path.GetExtension(FileUploadControl.PostedFile.FileName).ToLower().Replace(".", "");
if (allowedExtensions.Contains(extension))
// Good to go
这是给你的完整代码
if (FileUploadControl.PostedFile != null && FileUploadControl.PostedFile.ContentLength > 0)
var allowedExtensions = new string[] "doc", "docx", "pdf" ;
var extension = Path.GetExtension(FileUploadControl.PostedFile.FileName).ToLower().Replace(".", "");
if (FileUploadControl.FileContent.Length < 100000 && allowedExtensions.Contains(extension))
string filename =
Path.GetFileName(FileUploadControl.PostedFile.FileName);
string folder = Server.MapPath("~/Docfiles/");
Directory.CreateDirectory(folder);
FileUploadControl.PostedFile.SaveAs(Path.Combine(folder, filename));
try
cc.upload1(Txt_docde.Value, txt_dname.Value, FileUploadControl.FileName, Convert.ToInt32(Docdrop.SelectedValue), Convert.ToInt32(DropDownList2.SelectedValue), Convert.ToString(Session["Login2"]),Convert.ToInt32(Session["UserID"]));
StatusLabel.ForeColor = System.Drawing.Color.Green;
StatusLabel.Text = "Success";
catch
StatusLabel.ForeColor = System.Drawing.Color.Red;
Label2.Text = "Failed";
else
StatusLabel.ForeColor = System.Drawing.Color.Red;
Label2.Text = "File Size to big";
【讨论】:
我在此代码上方或其他地方添加此内容...if (FileUploadControl.PostedFile != null && FileUploadControl.PostedFile.ContentLength > 0) 您可以在检查大小FileUploadControl.FileContent.Length < 100000
后添加它。您几乎可以在 CreateDirectory
或 SaveAs
函数之前的任何位置添加此代码,因为当您保存文件时检查文件没有意义,对吧? :)
ok 现在在这里 ..if (allowedExtensions.Contains(extension)) // Good to go 我写什么代码?
在这里你要实际保存文件。【参考方案2】:
尝试这样的方法来验证您感兴趣的文件类型后缀:
if (string.Equals(fileExt, ".pdf", StringComparison.OrdinalIgnoreCase)) ...
【讨论】:
有人可以轻松上传 document.exe.pdf(其中一些用户没有显示文件扩展名,任何黑客都可以更改图标以使其看起来像一个单词或 pdf 文件)并发送一个虚假的 MIME 类型(根据其他答案,您的服务器上有一个恶意文档。所以我会在上面进行更改以确保没有今天所有可执行文件的列表 .exe msi zip rar shs【参考方案3】:您需要检查发布文件的扩展名或其 MIME 类型,以检测其格式是否正确。
去获取 MIME 类型,检查 ContentType
属性。
ASP.NET How to get MIME Type
【讨论】:
安全方面,mime 类型在技术上是可以伪造的。但这是正确的答案,检查文件扩展名也是明智之举,如下所示。【参考方案4】:如果要查找特定文件类型,可以使用 Path.GetExtension 方法。
string fileExtension = Path.GetExtension(filename);
if (fileExtension == ".doc") //or whatever file type your looking for
try
do your work
【讨论】:
以上是关于仅上传文档文件的主要内容,如果未能解决你的问题,请参考以下文章