HTML5 FileReader, как вернуть результат?
Я использую JS FileReader, и мне нужно получить результат после операции чтения файла и манипулировать этими данными. FileReader читается асинхронно, и я не знаю, когда результат готов к использованию. Как это сделать?
$(document).ready(function(){
$('#file_input').on('change', function(e){
var res = readFile(this.files[0]);
//my some manipulate with res
$('#output_field').text(res);
});
});
function readFile(file){
var reader = new FileReader(),
result = 'empty';
reader.onload = function(e)
{
result = e.target.result;
};
reader.readAsText(file);
//waiting until result is empty?
return result;
}
http://jsfiddle.net/ub22m/4/
Он показывает "пусто".
Как подождать, пока "результат" пуст?
Другой способ?
Ответы
Ответ 1
Чтение происходит асинхронно. Вам необходимо предоставить пользовательский ответ onload
, который определяет, что должно произойти, когда чтение будет завершено:
$(document).ready(function(){
$('#file_input').on('change', function(e){
readFile(this.files[0], function(e) {
// use result in callback...
$('#output_field').text(e.target.result);
});
});
});
function readFile(file, onLoadCallback){
var reader = new FileReader();
reader.onload = onLoadCallback;
reader.readAsText(file);
}
(Смотрите Fiddle.)
Обратите внимание, что readFile
не возвращает значение. Вместо этого он принимает функцию обратного вызова, которая будет срабатывать при каждом чтении. Операция $('#output_field').text
перемещается в функцию обратного вызова. Это гарантирует, что эта операция не будет работать до тех пор, пока обратный вызов читателя onload
не загорится, когда будет заполнен e.target.result
.
Программирование с обратными вызовами немного сложно получить сразу, но это абсолютно необходимо для реализации расширенных функций.
Ответ 2
Здесь javascript:
$(document).ready(function() {
$('#file_input').on('change', function(e) {
function updateProgress(evt) {
if (evt.lengthComputable) {
// evt.loaded and evt.total are ProgressEvent properties
var loaded = (evt.loaded / evt.total);
if (loaded < 1) {
// Increase the prog bar length
style.width = (loaded * 200) + "px";
}
}
}
function loaded(evt) {
// Obtain the read file data
var fileString = evt.target.result;
// Handle UTF-16 file dump
$('#output_field').text(fileString);
}
var res = readFile(this.files[0]);
var reader = new FileReader();
reader.readAsText(this.files[0], "UTF-8");
reader.onprogress = updateProgress;
reader.onload = loaded;
});
});
function readFile(file) {
var reader = new FileReader(),
result = 'empty';
reader.onload = function(e) {
result = e.target.result;
};
reader.readAsText(file);
return result;
}
И, конечно, часть HTML:
<input type="file" id="file_input" class="foo" />
<div id="progBar" style="background-color:black;width:1px;"> </div>
<div id="output_field" class="foo"></div>
Кажется, работает для *.txt файлов.
Посмотрите эту скрипту.
Ответ 3
использовать файл FileReader
<html>
<head>
<link rel="stylesheet" href="#" onclick="location.href='http://code.jquery.com/ui/1.11.3/themes/smoothness/jquery-ui.css'; return false;">
<script src="http://code.jquery.com/jquery-1.10.2.js"></script>
<script src="http://code.jquery.com/ui/1.11.3/jquery-ui.js"></script>
</head>
<body>
<script>
function PreviewImage() {
var oFReader = new FileReader();
oFReader.readAsDataURL(document.getElementById("uploadImage").files[0]);
oFReader.onload = function (oFREvent) {
var sizef = document.getElementById('uploadImage').files[0].size;
document.getElementById("uploadPreview").src = oFREvent.target.result;
document.getElementById("uploadImageValue").value = oFREvent.target.result;
};
};
jQuery(document).ready(function(){
$('#viewSource').click(function ()
{
var imgUrl = $('#uploadImageValue').val();
alert(imgUrl);
});
});
</script>
<div>
<input type="hidden" id="uploadImageValue" name="uploadImageValue" value="" />
<img id="uploadPreview" style="width: 150px; height: 150px;" /><br />
<input id="uploadImage" style="width:120px" type="file" size="10" accept="image/jpeg,image/gif, image/png" name="myPhoto" onchange="PreviewImage();" />
</div>
<a href="#" id="viewSource">Source file</a>
</body>
</html>