Giriş dosyası değişiklik durumunda AJAX / PHP kullanarak dosyayı yüklemeden önce dosya boyutunu bulmanın bir yolu var mı?
Giriş dosyası değişiklik durumunda AJAX / PHP kullanarak dosyayı yüklemeden önce dosya boyutunu bulmanın bir yolu var mı?
Yanıtlar:
Aşağıdaki HTML için
<input type="file" id="myFile" />
takip etmeyi dene:
//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);
});
Aşağıdaki konuya bakın:
FileList.files
bir dizisi benzeri File
, ki bu da Glob
. Ve spec göre , Glob
gerçekten de tanımlar size
sayısı özelliği bayt (boş bir dosya için 0). Yani evet, sonuç bayt cinsindendir .
<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 ve FF üzerinde çalışın
Yüklemeden önce dosyanın boyutunu almanın basit bir örneğini burada bulabilirsiniz. İçerik eklendiğinde veya değiştirildiğinde algılamak için jQuery kullanıyor, ancak yine de files[0].size
jQuery kullanmadan alabilirsiniz .
$(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>
İşte daha eksiksiz bir örnek, dosyaları FormData'ya Sürükle ve Bırak ve POST aracılığıyla bir sunucuya yüklemek için bazı konsept kodu kanıtı . Dosya boyutu için basit bir kontrol içerir.
Aynı sorunu yaşadım ve doğru bir çözüm bulamadık gibi görünüyor. Umarım bu diğer insanlara yardımcı olabilir.
Etrafı keşfetmeye zaman ayırdıktan sonra, sonunda cevabı buldum. Bu, jQuery ile dosya eklemek için kodum:
var attach_id = "id_of_attachment_file";
var size = $('#'+attach_id)[0].files[0].size;
alert(size);
Bu sadece dosya boyutunu elde etmek için örnek koddur. Başka şeyler yapmak istiyorsanız, ihtiyaçlarınızı karşılamak için kodu değiştirmekten çekinmeyin.
Tüm tarayıcılarda çalışan en iyi çözüm;)
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);
}
}
GÜNCELLEME: Bu işlevi IE tarayıcısı olup olmadığını kontrol etmek için kullanacağız
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;
}
$(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>
HTML5 desteğine sahip tarayıcılar, girdi türü için files özelliğine sahiptir. Bu elbette eski IE sürümlerinde çalışmayacaktır.
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);
}
ucefkh'nin çözümü en iyi sonucu verdi, ancak $ .browser jQuery 1.91'de kullanımdan kaldırıldığı için navigator.userAgent'ı kullanmak için değiştirmek zorunda kaldı:
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);
}
}
dosya boyutunu almak için bir ajax HEAD isteği yapmanız gerekir. jquery ile bunun gibi bir şey
var req = $.ajax({
type: "HEAD",
url: yoururl,
success: function () {
alert("Size is " + request.getResponseHeader("Content-Length"));
}
});
Lütfen ActiveX
, Internet Explorer'da korkutucu bir uyarı mesajı görüntüleyeceği ve kullanıcılarınızı korkutacağı için kullanmayın.
Herhangi biri bu denetimi uygulamak isterse, yalnızca modern tarayıcılarda bulunan FileList nesnesine ve yalnızca eski tarayıcılar için sunucu tarafı denetimlerine güvenmelidir ( aşamalı geliştirme ).
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;
}
HTML5 Dosya API'sını kullanarak yapabilirsiniz: http://www.html5rocks.com/en/tutorials/file/dndfiles/
Bununla birlikte, eski tarayıcılar için her zaman PHP (veya kullandığınız herhangi bir arka uç dili) için bir yedeğiniz olmalıdır.
Kişisel olarak, HTML standartları göz önüne alındığında Web World'ün cevabının bugün en iyisi olduğunu söyleyebilirim . IE <10'u desteklemeniz gerekiyorsa, bir çeşit ActiveX kullanmanız gerekecektir. Scripting.FileSystemObject'e karşı kodlamayı veya ActiveX'i doğrudan başlatmayı içeren önerilerden kaçınırdım.
Bu durumda, bunları desteklemeyen tarayıcıları doldurmak için HTML5 apis veya Flash / Silverlight kontrollerini kullanacak şekilde yapılandırılabilen plupload gibi 3. taraf JS kitaplıklarını kullanarak başarılı oldum . Plupload, IE <10'da çalışan dosya boyutunu kontrol etmek için istemci tarafında bir API'ye sahiptir.