jQueryを使用してファイル入力サイズを確認する方法


135

私はファイルアップロード機能を備えたフォームを持っていて、ユーザーがアップロードしようとしているファイルが大きすぎる場合にクライアント側のエラーレポートをいくつか表示できるようにしたいのですが、jQueryを使用してファイルサイズをチェックする方法はありますかクライアント上で、または何らかの方法でファイルをサーバーにポストして確認しますか?

回答:


275

実際にはファイルシステムにアクセスできません(ローカルファイルの読み取りや書き込みなど)。ただし、HTML5 File Api仕様により、アクセスできるファイルプロパティがいくつかあり、ファイルサイズはそのうちの1つです。

以下の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);

});

これはHTML5仕様の一部であるため、最新のブラウザー(IEにはv10が必要)でのみ機能し、知っておくべきその他のファイル情報に関する詳細とリンクをここに追加しましhttp : //felipe.sabino.me/javascript / 2012/01/30 / javascipt-checking-the-file-size /


古いブラウザのサポート

古いブラウザはnull前のthis.files呼び出しの値を返すため、アクセスするthis.files[0]と例外が発生し、それを使用する前にファイルAPIのサポートを確認する必要があることに注意してください


6
誰もがこれを行うことはできないと言っています-まだここにあります。これは機能します。私はそれをテストしました。
Peter

35
@Jeroen IEで働いていないことは多くの人にとって理想的な解決策ではないことに同意しますが、反対票を投じず、答えはあまり役に立たないと言っていませんか?私はこのソリューションを多種多様なエンタープライズWebソリューションで使用しましたが、ChromeやFirefoxでのみ機能する必要があり、このソリューションを探している人も同じ場所にいる可能性があるため、このソリューションで十分です。 。
フェリペサビノ

3
私はGoogleでこの回答に出くわしました。これを使用して、ユーザーが特定のサイズを超えるファイルを投稿しないようにします。サーバー側でもファイルサイズを確認しているので、IE8では機能しないクライアント側のソリューションがあれば嬉しいです。
スティーブウィルクス

2
@GaolaiPengこのエラーは、おそらくjQueryJavaScriptファイルが追加されなかった(または適切にロードされなかった)ためです。headページのに追加しましたか?
フェリペサビノ

1
@volumeoneだから、私の回答で「使用する前にファイルAPIのサポートを確認する」べきだと言ったので、それに応じてUIを変更できます。
フェリペサビノ2015年

41

jQueryを使用したいvalidate場合は、次のメソッドを作成してください。

$.validator.addMethod('filesize', function(value, element, param) {
    // param = size (en bytes) 
    // element = element to validate (<input>)
    // value = value of the element (file name)
    return this.optional(element) || (element.files[0].size <= param) 
});

あなたはそれを使うでしょう:

$('#formid').validate({
    rules: { inputimage: { required: true, accept: "png|jpe?g|gif", filesize: 1048576  }},
    messages: { inputimage: "File must be JPG, GIF or PNG, less than 1MB" }
});

1
@Danはい、ファイルサイズプロパティはHTML5仕様の一部であるため、最新のブラウザーでのみ機能します(IEの場合はバージョン10以降)
Felipe Sabino 14年

7
acceptルールを誤って使用しましたが、ルールを使用する必要がありましextensionた。〜ルールは唯一のMIMEタイプのためです。 ルールは、ファイル拡張子のためです。これらのルールファイルも含める必要があります。acceptextensionadditional-methods.js
Sparky

$('#formid').validate({ rules: { inputimage: { required: true, extension: "png|jpe?g|gif", filesize: 1048576 }}, messages: { inputimage: "File must be JPG, GIF or PNG, less than 1MB" } });
@Sparky

26

このコード:

$("#yourFileInput")[0].files[0].size;

フォーム入力のファイルサイズを返します。

FF 3.6以降では、このコードは次のようになります。

$("#yourFileInput")[0].files[0].fileSize;

2
最初のコードはChromeで動作しますが、2番目はFireFoxの最新バージョンでは動作しません。
デボラ

その2番目のコードは、すべての最新(2014以降のブラウザー)で使用しなければならないものです。
ドリーム

1
最初のコードはIE 10、11、Edge、Chrome、Safari(Windowsバージョン)、Brave、Firefoxで動作します。
Mashukur Ra​​hman

12

ASP.NET FileUploadコントロールに使用する私のソリューションも投稿しています。多分誰かがそれを便利だと思うでしょう。

    $(function () {        
    $('<%= fileUploadCV.ClientID %>').change(function () {

        //because this is single file upload I use only first index
        var f = this.files[0]

        //here I CHECK if the FILE SIZE is bigger than 8 MB (numbers below are in bytes)
        if (f.size > 8388608 || f.fileSize > 8388608)
        {
           //show an alert to the user
           alert("Allowed file size exceeded. (Max. 8 MB)")

           //reset file upload control
           this.value = null;
        }
    })
});

1
の値をnullチェックする必要がありf = this.files[0]ます。そうしないと、古いブラウザでは失敗します。例if (f && (f.size > 8388608 || f.fileSize > 8388608))
コーディングを行った

9

以下を使用してファイルのサイズを確認し、それより大きい場合はクリアします。

    $("input[type='file']").on("change", function () {
     if(this.files[0].size > 2000000) {
       alert("Please upload file less than 2MB. Thanks!!");
       $(this).val('');
     }
    });

1
$(this).val(null);を使用する必要があります そうしないと、適切な添付ファイルを選択しないと、フォームが正しく送信されなくなったように見えます。
Kevin Grabher

1

このタイプのチェックは、FlashまたはSilverlightでは実行できますが、JavaScriptでは実行できません。JavaScriptサンドボックスでは、ファイルシステムへのアクセスは許可されていません。サイズの確認は、アップロード後にサーバー側で行う必要があります。

Silverlight / Flashルートに移動する場合は、通常のコントロールを使用する通常のファイルアップロードハンドラーがデフォルトでインストールされていないかどうかを確認できます。このように、Silverlight / Flashがインストールされている場合、エクスペリエンスはもう少し豊かになります。


1
<form id="uploadForm" class="disp-inline" role="form" action="" method="post" enctype="multipart/form-data">
    <input type="file" name="file" id="file">
</form>
<button onclick="checkSize();"></button>
<script>
    function checkSize(){
        var size = $('#uploadForm')["0"].firstChild.files["0"].size;
        console.log(size);
    }
</script>

標準のajax / html5メソッドでフォームを送信する予定がない場合は、これが最も簡単であることがわかりましたが、もちろん何でも機能します。

ノート:

var size = $('#uploadForm')["0"]["0"].files["0"].size;

これは以前は機能しましたが、Chromeでは機能しなくなりました。上記のコードをテストしたところ、ffとchrome(最新)の両方で機能しました。2番目の["0"]がfirstChildになりました。


0

これを試してください:

var sizeInKB = input.files[0].size/1024; //Normally files are in bytes but for KB divide by 1024 and so on
var sizeLimit= 30;

if (sizeInKB >= sizeLimit) {
    alert("Max file size 30KB");
    return false;
}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.