上传前获取文件大小


89

在输入文件发生更改的情况下,在使用AJAX / PHP上传文件之前,是否可以找到文件大小?




这是获取文件名,类型和大小的逐步指南,codepedia.info /…
Satinder singh,

Answers:


132

对于HTML波纹管

<input type="file" id="myFile" />

尝试以下方法:

//binds to onchange event of your input field
$('#myFile').bind('change', function() {

  //this.files[0].size gets the size of your file.
  alert(this.files[0].size);

});

请参阅以下线程:

如何使用jQuery检查文件输入大小?


1
Internet Explorer(旧版本)中是否不存在文件数组?
TiagoCésarOliveira

4
是的,这在IE 10之前不起作用,并且仅在android和ios中得到部分支持。caniuse.com/fileapi。如果只是这么简单...
骗人

2
我想结果以字节为单位?
Erdal G.

4
@ErdalG。好问题!MDN 缺少文档,但它是对象FileList.files的数组File,是的扩展Glob。并且根据规范Glob确实将size属性定义为字节数(空文件为0)。所以是的,结果以字节为单位
John Weisz

14
<script type="text/javascript">
function AlertFilesize(){
    if(window.ActiveXObject){
        var fso = new ActiveXObject("Scripting.FileSystemObject");
        var filepath = document.getElementById('fileInput').value;
        var thefile = fso.getFile(filepath);
        var sizeinbytes = thefile.size;
    }else{
        var sizeinbytes = document.getElementById('fileInput').files[0].size;
    }

    var fSExt = new Array('Bytes', 'KB', 'MB', 'GB');
    fSize = sizeinbytes; i=0;while(fSize>900){fSize/=1024;i++;}

    alert((Math.round(fSize*100)/100)+' '+fSExt[i]);
}
</script>

<input id="fileInput" type="file" onchange="AlertFilesize();" />

在IE和FF上工作


15
投票失败,因为答案使用ActiveX。在2015年,甚至Microsoft也放弃了ActiveX。当给出合理建议时,我建议开发人员现在和将来避免这样做。
斯科特

3
我喜欢这种解决方案,因为只有较旧版本的IE才会为window.ActiveXObject返回true。
Rob Breidecker 2015年

@scottstone我不明白您为什么不赞成所有支持旧版浏览器的答案?这个答案比使用浏览器指纹的答案要干净得多,并且绝不建议任何人使用ActiveX。
Nicolas Bouvrette

@NicolasBouvrette-我同意这个答案比其他答案要干净得多,但是我目前无法删除不赞成投票的人。最初的问题并没有要求与IE的旧版本兼容,并且该答案也没有告诉读者大多数代码都支持5年以上的IE版本。
斯科特·斯通斯通

@scottstone实际上,就为什么不使用ActiveX而言,我有一个更明确的观点是因为它在IE中显示警告消息,这是可怕的(可怕的)用户体验。
Nicolas Bouvrette

13

这是在上传之前获取文件大小的简单示例。它使用jQuery来检测添加或更改内容的时间,但是您仍然可以在files[0].size不使用jQuery的情况下进行操作。

$(document).ready(function() {
  $('#openFile').on('change', function(evt) {
    console.log(this.files[0].size);
  });
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<form action="upload.php" enctype="multipart/form-data" method="POST" id="uploadform">
  <input id="openFile" name="img" type="file" />
</form>

这是一个更完整的示例,提供了一些概念验证代码,可将文件拖放到FormData中并通过POST上载到服务器。它包括对文件大小的简单检查。


8

我遇到了同样的问题,似乎我们还没有一个准确的解决方案。希望这可以帮助其他人。

经过一段时间的探索,我终于找到了答案。这是我用jQuery附加文件的代码:

var attach_id = "id_of_attachment_file";
var size = $('#'+attach_id)[0].files[0].size;
alert(size);

这只是获取文件大小的示例代码。如果您想做其他事情,请随时更改代码以满足您的需求。


我喜欢这个,因为它不需要像最流行的解决方案那样进行更改。我也很喜欢您已经允许我更改代码以满足我的需要的事实:)
Matt

8

适用于所有浏览器的最佳解决方案;)

function GetFileSize(fileid) {
    try {
        var fileSize = 0;
        // for IE
        if(checkIE()) { //we could use this $.browser.msie but since it's deprecated, we'll use this function
            // before making an object of ActiveXObject, 
            // please make sure ActiveX is enabled in your IE browser
            var objFSO = new ActiveXObject("Scripting.FileSystemObject");
            var filePath = $("#" + fileid)[0].value;
            var objFile = objFSO.getFile(filePath);
            var fileSize = objFile.size; //size in b
            fileSize = fileSize / 1048576; //size in mb 
        }
        // for FF, Safari, Opeara and Others
        else {
            fileSize = $("#" + fileid)[0].files[0].size //size in b
            fileSize = fileSize / 1048576; //size in mb 
        }
        alert("Uploaded File Size is" + fileSize + "MB");
    }
    catch (e) {
        alert("Error is :" + e);
    }
}

来自http://www.dotnet-tricks.com/Tutorial/jquery/HHLN180712-Get-file-size-before-upload-using-jquery.html

更新: 我们将使用此功能来检查它是否是IE浏览器

function checkIE() {
    var ua = window.navigator.userAgent;
    var msie = ua.indexOf("MSIE ");

    if (msie > 0 || !!navigator.userAgent.match(/Trident.*rv\:11\./)){  
        // If Internet Explorer, return version number
        alert(parseInt(ua.substring(msie + 5, ua.indexOf(".", msie))));
    } else {
        // If another browser, return 0
        alert('otherbrowser');
    }

    return false;
}

3
投票失败,因为答案使用ActiveX。在2015年,甚至Microsoft也放弃了ActiveX。当给出合理建议时,我建议开发人员现在和将来避免这样做。–
斯科特

1
$ .browser已从1.9版(从v 1.3开始不推荐使用)中删除。
Silvio Delgado 2015年

2
@scottstone这是其向后兼容性和事实并非如此,微软不会押顿的ActiveX它在许多事情要多用,这里是证明computerworld.com/article/2481188/internet/...
ucefkh

@SilvioDelgado进行了更改和更新,将$ .browser删除到了插件中,因此我们只需要对IE浏览器进行一次小型测试(适用于所有版本)
ucefkh 2015年

4

$(document).ready(function() {
  $('#openFile').on('change', function(evt) {
    console.log(this.files[0].size);
  });
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<form action="upload.php" enctype="multipart/form-data" method="POST" id="uploadform">
  <input id="openFile" name="img" type="file" />
</form>


3

支持HTML5的浏览器具有输入类型的文件属性。当然,这在较旧的IE版本中将不起作用。

var inpFiles = document.getElementById('#fileID');
for (var i = 0; i < inpFiles.files.length; ++i) {
    var size = inpFiles.files.item(i).size;
    alert("File Size : " + size);
}

2

ucefkh的解决方案效果最好,但是由于$ .browser在jQuery 1.91中已弃用,因此必须更改为使用navigator.userAgent:

function IsFileSizeOk(fileid) {
    try {
        var fileSize = 0;
        //for IE
        if (navigator.userAgent.match(/msie/i)) {
            //before making an object of ActiveXObject, 
            //please make sure ActiveX is enabled in your IE browser
            var objFSO = new ActiveXObject("Scripting.FileSystemObject");
            var filePath = $("#" + fileid)[0].value;
            var objFile = objFSO.getFile(filePath);
            var fileSize = objFile.size; //size in b
            fileSize = fileSize / 1048576; //size in mb 
        }
        //for FF, Safari, Opeara and Others
        else {
            fileSize = $("#" + fileid)[0].files[0].size //size in b
            fileSize = fileSize / 1048576; //size in mb 
        }
        return (fileSize < 2.0);
    }
    catch (e) {
        alert("Error is :" + e);
    }
}

1

您需要执行ajax HEAD请求以获取文件大小。与jQuery的是这样的

  var req = $.ajax({
    type: "HEAD",
    url: yoururl,
    success: function () {
      alert("Size is " + request.getResponseHeader("Content-Length"));
    }
  });

但是,如果该文件输入将清除(空)?您能举个例子吗?
-DeLe

1

请不要使用ActiveX它,因为它会在Internet Explorer中显示可怕的警告消息,并吓跑您的用户。

ActiveX警告

如果有人要实现此检查,则他们应该仅依赖于现代浏览器中可用的FileList对象,而仅依靠服务器端检查(针对较旧的浏览器)(渐进增强)。

function getFileSize(fileInputElement){
    if (!fileInputElement.value ||
        typeof fileInputElement.files === 'undefined' ||
        typeof fileInputElement.files[0] === 'undefined' ||
        typeof fileInputElement.files[0].size !== 'number'
    ) {
        // File size is undefined.
        return undefined;
    }

    return fileInputElement.files[0].size;
}

0

您可以使用PHP文件大小功能。在使用ajax上传期间,请首先通过向php脚本发出ajax请求来检查文件大小,该脚本检查文件大小并返回值。



0

就个人而言,考虑到HTML标准,我会说Web World的答案是当今最好的。如果需要支持IE <10,则需要使用某种形式的ActiveX。我将避免涉及针对Scripting.FileSystemObject进行编码或直接实例化ActiveX的建议。

在这种情况下,我已经成功使用了第三方第三方JS库(例如plupload),可以将其配置为使用HTML5 API或Flash / Silverlight控件来回填不支持这些功能的浏览器。Plupload具有用于检查在IE <10中工作的文件大小的客户端API。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.