ASP.NET - 限制文件上载可用的文件类型

时间:2011-12-13 14:57:05

标签: c# asp.net file-upload

我已将文件上传添加到我的asp.net网站。但是,我想限制用户可以选择的文件类型。例如,我只有用户选择mp3文件。如何在文件上传中添加过滤器,使其仅显示所选文件夹中的mp3文件?

 <asp:FileUpload ID="FileUpload1" runat="server" />
 <asp:Button ID="btnAudUpload" Text="Upload" CssClass="btncssUpload" OnClick="btnAudUpload_Click" runat="server" />

10 个答案:

答案 0 :(得分:33)

使用RegularExpressionValidator可能对您有所帮助。检查文件扩展名不需要服务器端代码。看看这段代码

<asp:RegularExpressionValidator ID="uplValidator" runat="server" ControlToValidate="FileUpload1"
 ErrorMessage=".mp3, .mp4 & wma formats are allowed" 
 ValidationExpression="(.+\.([Mm][Pp][3])|.+\.([Mm][Pp][4])|.+\.([Ww][Mm][Aa]))"></asp:RegularExpressionValidator>

请记住,您现在需要做的就是添加一个id为FileUpload1的文件上传控件。完成。您可以按F5查看效果

答案 1 :(得分:22)

直接在标记中使用接受属性(控件不支持它,但无论如何都会将其传递给客户端)

虽然可以列出文件扩展名,例如:“。xls,.xlsx”,但不建议这样做,并且有些浏览器会对此感到困惑。

最好使用MIME类型(浏览器会将它们映射到适当的扩展名):

 Upload MP3: <asp:FileUpload runat="server" accept=""audio/mpeg" />

如果需要,请使用以逗号分隔的列表,例如:

 Upload Excel files: <asp:FileUpload runat="server" 
                 accept="application/vnd.ms-excel,application/vnd.openxmlformats-officedocument.spreadsheetml.sheet" />

支持的浏览器和更多信息:http://www.w3schools.com/tags/att_input_accept.asp

下面的常见MIME类型(http://www.sitepoint.com/web-foundations/mime-types-summary-list/的快照)

.au audio/basic
.avi video/msvideo, video/avi, video/x-msvideo
.bmp image/bmp
.bz2 application/x-bzip2
.css text/css
.dtd application/xml-dtd
.doc application/msword
.docx application/vnd.openxmlformats-officedocument.wordprocessingml.document
.dotx application/vnd.openxmlformats-officedocument.wordprocessingml.template
.es application/ecmascript
.exe application/octet-stream
.gif image/gif
.gz application/x-gzip
.hqx application/mac-binhex40
.html text/html
.jar application/java-archive
.jpg image/jpeg
.js application/x-javascript
.midi audio/x-midi
.mp3 audio/mpeg
.mpeg video/mpeg
.ogg audio/vorbis, application/ogg
.pdf application/pdf
.pl application/x-perl
.png image/png
.potx application/vnd.openxmlformats-officedocument.presentationml.template
.ppsx application/vnd.openxmlformats-officedocument.presentationml.slideshow
.ppt application/vnd.ms-powerpointtd>
.pptx application/vnd.openxmlformats-officedocument.presentationml.presentation
.ps application/postscript
.qt video/quicktime
.ra audio/x-pn-realaudio, audio/vnd.rn-realaudio
.ram audio/x-pn-realaudio, audio/vnd.rn-realaudio
.rdf application/rdf, application/rdf+xml
.rtf application/rtf
.sgml text/sgml
.sit application/x-stuffit
.sldx application/vnd.openxmlformats-officedocument.presentationml.slide
.svg image/svg+xml
.swf application/x-shockwave-flash
.tar.gz application/x-tar
.tgz application/x-tar
.tiff image/tiff
.tsv text/tab-separated-values
.txt text/plain
.wav audio/wav, audio/x-wav
.xlam application/vnd.ms-excel.addin.macroEnabled.12
.xls application/vnd.ms-excel
.xlsb application/vnd.ms-excel.sheet.binary.macroEnabled.12
.xlsx application/vnd.openxmlformats-officedocument.spreadsheetml.sheet
.xltx application/vnd.openxmlformats-officedocument.spreadsheetml.template
.xml application/xml
.zip application/zip, application/x-compressed-zip

答案 2 :(得分:5)

如上所述,它不可能开箱即用。

我发现的更简单的解决方案:使用RegularExpressionValidator检查文件扩展名。不需要JavaScript或外部库。当然,它只检查扩展名,而不是文件内容(您必须使用服务器端代码并​​检查字节),并且不会更改文件夹浏览器中显示的文件列表。

<asp:RegularExpressionValidator ControlToValidate="FileUpload1" ValidationExpression="^.*\.(mp3|MP3)$" runat="server" />

答案 3 :(得分:4)

默认文件上传器没有选项,但您可以使用Uploadify等工具来实现此目标。但是,如果这是一个问题,它是基于闪存。您可以在limited file types demo上试用。

如果您不想使用闪存,最简单的方法是通过javascript或服务器端自行进行验证,并告知用户文件的类型是否无效。

file-input-accept-attribute-is-it-useful是另一个类似的问题,可能会提供一些有用的信息。

答案 4 :(得分:4)

<asp:RegularExpressionValidator ID="rexp" runat="server" ControlToValidate="fupProduct"
     ErrorMessage="Only .gif, .jpg, .png, .tiff and .jpeg"
     ValidationExpression="(.*\.([Gg][Ii][Ff])|.*\.([Jj][Pp][Gg])|.*\.([Bb][Mm][Pp])|.*\.([pP][nN][gG])|.*\.([tT][iI][iI][fF])$)"></asp:RegularExpressionValidator>

答案 5 :(得分:3)

ASP.NET中的FileUpload控件无法实现,但以下链接可能有所帮助:

http://forums.asp.net/p/1136820/1817938.aspx

答案 6 :(得分:1)

我有一个用于上传PDF文件的类似应用程序。虽然上传控件开箱即用的文件类型过滤器会很棒,但我发现它并不能解决限制文件类型上传的问题。

例如,如果用户只是简单地从&#34; myfile.docx&#34;重命名Word文档。 to&#34; myfile.pdf&#34;系统会认为它是一个有效的文件,即使实际的文件编码无效;这会在应用程序的其他部分引起问题。

要实际解决此问题,可以从控件中获取字节数组并将其解析为字符串。然后应用过滤器。这是我的代码:

private static void CheckForValidFileType(byte[] data)
{
    var text = ASCIIEncoding.ASCII.GetString(data);
    if (!text.StartsWith("%PDF"))
        throw new Exception("Invalid file type selected.");
}

当然,您需要知道哪些模式对您的文件类型有效,并且可能希望使用RegEx而不是.Net字符串帮助方法,但一般的想法是实际检查实际文件内容而不是依赖在文件扩展名上进行验证。

Ryan A.

答案 7 :(得分:1)

没有问题。在这里!

<asp:FileUpload ID="FileUpload1" runat="server" accept=".mp3"/>

答案 8 :(得分:0)

这可能是一个非常古老的话题,但是如果有其他人有这个问题的话 我发现这对我有用

因为asp:FileUpload在客户端转换为html标签,所以从逻辑上讲,你可以添加html标签。

它对我有用,现在你只能选择那些文件条纹并且不需要正则表达式

答案 9 :(得分:0)

使用以下代码js代码仅选择我们要选择的所需文件类型。 在下面的例子中我想只选择zip文件,在浏览时它只显示zip文件扩展名文件名

&#13;
&#13;
  (function ($) {
            $.fn.acceptFileType = function (types) {
                if (types == undefined) {
                    return true;
                } else {
                    types = types.split(",")
                }
                this.each(function () {
                    $(this).bind("change", function () {
                        if (!$.inArray($(this).val().replace(/([\d\w.]+)(\.[a-z0-9]+)/i, '\2'), types)) {
                            $(this).val('');
                            return false;
                        }
                        return true;
                    });
                });
            };
        })(jQuery);
        $(":file").acceptFileType(".zip");
        
        
        
         <input type="file" id="txtFileUploadGrid" runat="server" accept=".zip,application/octet-stream,application/zip,application/x-zip,application/x-zip-compressed" />
        
        
        
        
&#13;
&#13;
&#13;