Я пытаюсь создать сценарий загрузки, который изменяет размер клиентской части нескольких изображений до того, как будет обработано saveimage.php. Причина этого в том, что они будут загружены в другом месте, где может быть очень медленный интернет.Загрузите несколько изображений холста через цикл javascript
Я нашел здесь фрагменты кода, которые помогли мне собрать его вместе. Я всего лишь новичок, поэтому, наверное, это очень грязно!
В настоящее время он проверяет, когда файлы вводятся в поле «file_input». Затем он просматривает количество файлов и просматривает их до тех пор, пока каждый файл не будет помещен в холст и не будет загружен, пока он там.
Однако проблема заключается в следующем:, когда я не добавляю предупреждение для каждого файла, цикл идет слишком быстро и обрабатывает только 1 или 2 из 10 изображений, например. Поскольку сценарий загрузки будет работать быстрее, чем холст может быть обновлен с новым изображением.
Это моя текущая страница, упрощена до ядра:
<!DOCTYPE html>
<html>
<head>
<script type="text/javascript" src="http://code.jquery.com/jquery.min.js"></script>
</head>
<body>
<form>
<input id="file_input" type='file' multiple />
</form>
<div id="preview">
<canvas id="canvas"></canvas>
</div>
<script>
var input = document.getElementById('file_input');
input.addEventListener('change', handleFiles);
function handleFiles(e) {
var files = input.files;
alert(files.length +" files are being uploaded!"); // display amount of files for testing purpose
for (var i = 0; i < files.length; ++i) {
alert("Upload file number: "+i); // display file # for testing purpose, when this is removed the script will go too fast
var MAX_HEIGHT = 1000;
var ctx = document.getElementById('canvas').getContext('2d');
var img = new Image;
img.onload = function(){
if(img.height > MAX_HEIGHT) {
img.width *= MAX_HEIGHT/img.height;
img.height = MAX_HEIGHT;
}
var ctx = canvas.getContext("2d");
ctx.clearRect(0, 0, canvas.width, canvas.height);
preview.style.width = img.width + "px";
preview.style.height = img.height + "px";
canvas.width = img.width;
canvas.height = img.height;
ctx.drawImage(img, 0, 0, img.width, img.height);
// the canvas should contain an image now and this will send it through saveimage.php
var myDrawing = document.getElementById("canvas");
var drawingString = myDrawing.toDataURL("image/jpeg", 0.5);
var postData = "canvasData="+drawingString;
var ajax = new XMLHttpRequest();
ajax.open("POST",'saveimage.php',true);
ajax.setRequestHeader('Content-Type', 'canvas/upload');
ajax.onreadystatechange=function()
{
if (ajax.readyState == 4);
}
ajax.send(postData);
};
img.src = URL.createObjectURL(e.target.files[i]);
}
}
</script>
</body>
</html>
И это мой saveimage.php, который хорошо работает, но только для полного обзора:
<?php
if (isset($GLOBALS["HTTP_RAW_POST_DATA"]))
{
$rawImage=$GLOBALS['HTTP_RAW_POST_DATA'];
$removeHeaders=substr($rawImage, strpos($rawImage, ",")+1);
$decode=base64_decode($removeHeaders);
// check if the file already exists and keep adding +1 intil it's unique
$i = 1;
while(file_exists('uploads/image'.$i.'.jpg')) {
$i++;
}
$fopen = fopen('uploads/image'.$i.'.jpg', 'wb');
fwrite($fopen, $decode);
fclose($fopen);
}
?>
Немного дополнительной информации:
- Я добавил холст, потому что, насколько я понимаю, это только способ изменить размер изображения на стороне клиента. В финальном скрипте будет установлено .
- Если холст может быть пропущен и данные отправлены в saveimage.php сразу же это решит проблему тоже, я думаю.
- Как я уже сказал, я не очень разбираюсь в javascript, поэтому, если есть гораздо более простой способ достижения этой цели. Пожалуйста, дайте мне знать!
Заранее благодарен!
Перед выполнением чего-либо еще: установите обработчик onload * before *, установите src. – GameAlchemist
@GameAlchemist Я поместил обработчик onload перед src сейчас, он все еще функционирует одинаково, в чем причина? – Pascal