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

26

我在我的ASP.NET网站中添加了一个文件上传功能。然而,我想限制用户可以选择的文件类型。例如,我只希望用户选择MP3文件。如何添加文件上传过滤器,以便它仅在所选文件夹中显示MP3文件?

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

1
你可以参考以下链接: https://dev59.com/RHVD5IYBdhLWcg3wJIEK 或者 https://dev59.com/3m855IYBdhLWcg3woV0_祝编码愉快!! - Ravi Vanapalli
10个回答

35

使用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,非常好的解决方案。我只想补充一下,如果有人想使用另一个正则表达式,可以访问http://msdn.microsoft.com/en-us/library/ms972966.aspx。 - RdPC
2
如果我理解正确的话,这并不限制文件选择器中可用的类型,它只是在选择了无效文件时阻止上传。不过这个想法很好! - Ekus
@Ekus 没错,就是这样。 - Mubarek

34

直接在标签中使用accept属性(虽然控件并不真正支持它,但仍会被传递到客户端)

虽然您可以列出文件扩展名,例如:".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
下拉菜单中仍然存在“所有文件”选项。有没有办法把它删除? - Biswajeet
1
@Biswajeet 我认为在常见的桌面浏览器中,没有办法防止“所有文件”或防止用户键入*.*作为文件名并无论如何显示所有文件。但请参见其他答案,在选择文件后向字段添加验证 - https://dev59.com/xWoy5IYBdhLWcg3wiecp#8492937 - Ekus

6

如上所述,这是无法直接实现的。

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

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

4
默认文件上传器没有选项,但您可以使用工具如Uploadify来实现此目标。然而,它是基于Flash的,如果这是一个问题,您可以在他们的有限文件类型演示上尝试一下。
如果您不想使用Flash,最简单的方法是通过JavaScript或服务器端自行验证并通知用户文件的类型是否有效。 file-input-accept-attribute-is-it-useful是另一个类似的问题,可能会提供一些有用的信息。

4
我想知道为什么我被踩了。如果这是因为闪光选项,那么仅仅因为你不喜欢它并不意味着它对其他人来说不是有效的选择。我只是给被问者提供更多可供选择的选项。 - Josh Mein

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>

3

2

没问题,这里是!

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

1
我有一个类似的应用程序,用于上传PDF文件。虽然如果上传控件具有开箱即用的文件类型过滤器将会很棒,但我发现这并不能真正解决限制要上传的文件类型的问题。
例如,如果用户只是将Word文档从“myfile.docx”重命名为“myfile.pdf”,系统将假定它是有效的文件,即使实际的文件编码无效;这将在应用程序的其他部分引起问题。
要真正解决这个问题,您可以从控件中获取字节数组并将其解析为字符串,然后应用过滤器。以下是我拥有的代码:
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字符串辅助方法,但总体思路是实际检查实际文件内容而不是仅依赖文件扩展名进行验证。

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

  (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" />
        
        
        
        


0
这可能是一个非常老的话题,但如果有人有这个问题,我发现对我有用
因为asp:FileUpload在客户端转换为html标签,逻辑上讲,您也可以添加html标签。
对我有用,现在您只能选择那些文件类型,而不需要正则表达式。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接