JavaScriptでアップロードする前にファイルサイズを確認する方法はありますか?
はい、最近のブラウザでサポートされているW3Cの新機能、 File API これはこの目的のために使用することができ、それがサポートされているかどうかをテストし、サポートされていなければ(必要なら)別のメカニズムにフォールバックすることは簡単です。
これが完全な例です。
<!DOCTYPE HTML>
<html>
<head>
<meta http-equiv="Content-type" content="text/html;charset=UTF-8">
<title>Show File Data</title>
<style type='text/css'>
body {
font-family: sans-serif;
}
</style>
<script type='text/javascript'>
function showFileSize() {
var input, file;
// (Can't use `typeof FileReader === "function"` because apparently
// it comes back as "object" on some browsers. So just see if it's there
// at all.)
if (!window.FileReader) {
bodyAppend("p", "The file API isn't supported on this browser yet.");
return;
}
input = document.getElementById('fileinput');
if (!input) {
bodyAppend("p", "Um, couldn't find the fileinput element.");
}
else if (!input.files) {
bodyAppend("p", "This browser doesn't seem to support the `files` property of file inputs.");
}
else if (!input.files[0]) {
bodyAppend("p", "Please select a file before clicking 'Load'");
}
else {
file = input.files[0];
bodyAppend("p", "File " + file.name + " is " + file.size + " bytes in size");
}
}
function bodyAppend(tagName, innerHTML) {
var Elm;
Elm = document.createElement(tagName);
Elm.innerHTML = innerHTML;
document.body.appendChild(Elm);
}
</script>
</head>
<body>
<form action='#' onsubmit="return false;">
<input type='file' id='fileinput'>
<input type='button' id='btnLoad' value='Load' onclick='showFileSize();'>
</form>
</body>
</html>
そして ここで それは実行中です。 ChromeまたはFirefoxの最新バージョンでそれを試してください。
少し話題から外れていますが、クライアントサイドのバリデーションは代替なしでサーバーサイドのバリデーションであることに注意してください。クライアント側の検証は純粋により良いユーザーエクスペリエンスを提供することを可能にするためのものです。たとえば、5MBを超えるファイルのアップロードを許可しない場合は、クライアントサイドの検証を使用して、ユーザーが選択したファイルのサイズが5MBを超えていないことを確認し、それがあればNice Friendlyメッセージを表示できます。 (だからサーバに結果を捨てるためだけにアップロードに費やすのではありません)しかし、もにしなければなりません。クライアント側の制限(およびその他の検証)は回避できます。
Jqueryを使う:
<form action="upload" enctype="multipart/form-data" method="post">
Upload image:
<input id="image-file" type="file" name="file" />
<input type="submit" value="Upload" />
<script type="text/javascript">
$('#image-file').bind('change', function() {
alert('This file size is: ' + this.files[0].size/1024/1024 + "MB");
});
</script>
</form>
動的および静的ファイル要素に対して機能します
Javascriptのみの解決策
function ValidateSize(file) {
var FileSize = file.files[0].size / 1024 / 1024; // in MB
if (FileSize > 2) {
alert('File size exceeds 2 MB');
// $(file).val(''); //for clearing with Jquery
} else {
}
}
<input onchange="ValidateSize(this)" type="file">
いいえ はい、新しいブラウザではFile APIを使用しています。詳細はTJの答えを見てください。
古いブラウザもサポートする必要がある場合は、 SWFUpload または のようなFlashベースのアップローダを使用する必要がありますこれを行うにはUploadify をクリックしてください。
SWFUpload機能のデモ は、file_size_limit
設定の仕組みを示しています。
これには(明らかに)Flashが必要です。さらに、その動作方法は通常のアップロードフォームとは少し異なります。
とても簡単です。
var oFile = document.getElementById("fileUpload").files[0]; // <input type="file" id="fileUpload" accept=".jpg,.png,.gif,.jpeg"/>
if (oFile.size > 2097152) // 2 mb for bytes.
{
alert("File size must under 2mb!");
return;
}
あなたがjQueryの検証を使用している場合は、このようなものを書くことができます:
$.validator.addMethod(
"maxfilesize",
function (value, element) {
if (this.optional(element) || ! element.files || ! element.files[0]) {
return true;
} else {
return element.files[0].size <= 1024 * 1024 * 2;
}
},
'The file size can not exceed 2MB.'
);
私はMozilla Developer Networkサイト https://developer.mozilla.org/en-US/docs/Using_files_from_web_applications で見つけた1つの主要なJavascript関数を使っています。 AJAXと私のニーズに応じて変更されました。それは私がファイルサイズを書きたい私のhtmlコードの中の場所に関する文書要素IDを受け取ります。
<Javascript>
function updateSize(elementId) {
var nBytes = 0,
oFiles = document.getElementById(elementId).files,
nFiles = oFiles.length;
for (var nFileId = 0; nFileId < nFiles; nFileId++) {
nBytes += oFiles[nFileId].size;
}
var sOutput = nBytes + " bytes";
// optional code for multiples approximation
for (var aMultiples = ["K", "M", "G", "T", "P", "E", "Z", "Y"], nMultiple = 0, nApprox = nBytes / 1024; nApprox > 1; nApprox /= 1024, nMultiple++) {
sOutput = " (" + nApprox.toFixed(3) + aMultiples[nMultiple] + ")";
}
return sOutput;
}
</Javascript>
<HTML>
<input type="file" id="inputFileUpload" onchange="uploadFuncWithAJAX(this.value);" size="25">
</HTML>
<Javascript with XMLHttpRequest>
document.getElementById('spanFileSizeText').innerHTML=updateSize("inputFileUpload");
</XMLHttpRequest>
乾杯
質問に答えても、私は自分の答えを投稿したいと思いました。次のコードのように使うことができます。
<input type="file" id="fileinput" />
<script type="text/javascript">
function readSingleFile(evt) {
//Retrieve the first (and only!) File from the FileList object
var f = evt.target.files[0];
if (f) {
var r = new FileReader();
r.onload = function(e) {
var contents = e.target.result;
alert( "Got the file.n"
+"name: " + f.name + "n"
+"type: " + f.type + "n"
+"size: " + f.size + " bytesn"
+ "starts with: " + contents.substr(1, contents.indexOf("n"))
);
if(f.size > 5242880) {
alert('File size Greater then 5MB!');
}
}
r.readAsText(f);
} else {
alert("Failed to load file");
}
}
このスレッドで提供されているJQueryの例は非常に古く、Googleはまったく役に立ちませんでしたので、ここに私の改訂版を示します。
<script type="text/javascript">
$('#image-file').on('change', function() {
console.log($(this)[0].files[0].name+' file size is: ' + $(this)[0].files[0].size/1024/1024 + 'Mb');
});
</script>
あなたはこれを試すことができます fineuploader
それはIE6(およびそれ以上)、ChromeまたはFirefoxの下でうまく動きます
私はそのようなものを作りました:
$('#image-file').on('change', function() {
var numb = $(this)[0].files[0].size/1024/1024;
numb = numb.toFixed(2);
if(numb > 2){
alert('to big, maximum is 2MB');
} else {
alert('it okey, your file has ' + numb + 'MB')
}
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.0.0/jquery.min.js"></script>
<input type="file" id="image-file">