Jump to content
  • 0

Загрузка нескольких файлов (изображений)


Чебурашка
 Share

Question

Здравствуйте!

Нашел неплохой скрипт загрузки нескольких файлов

<script>

function xdropFile(btn){
if(document.getElementById) {
tr = btn;
while (tr.tagName != 'TR') tr = tr.parentNode;
tr.parentNode.removeChild(tr);
xcheckForLast();
}
}
function xaddFile(btn){
if(document.getElementById) {
tr = btn;
while (tr.tagName != 'TR') tr = tr.parentNode;
var idSuffix = Math.round(Math.random()*1000);
var newTr = tr.parentNode.insertBefore(tr.cloneNode(true),tr.nextSibling);
thisChilds = newTr.getElementsByTagName('td');
for (var i = 0; i < thisChilds.length; i++){
if (thisChilds[i].className == 'header') thisChilds[i].innerHTML = '';
if (thisChilds[i].className == 'files') thisChilds[i].innerHTML = '<input size="32" name="xtt[]" class="wideFile" type="file">';
}
checkForLast();
}
}
function xcheckForLast(){
btns = document.getElementsByName('xdrop');
for (i = 0; i < btns.length; i++){
btns[i].disabled = (btns.length == 1) ? true : false;
}
}

</script>

echo "
<table width=20% align=center>
<tr>
<td width=\"20%\"><input type=\"file\" size=\"32\" name=\"xtt[]\"></td>
<td nowrap=\"nowrap\"><input type=\"button\" name=\"xdrop\" value=\" − \" onClick=\"xdropFile(this);\">
<input type=\"button\" value=\" + \" onClick=\"xaddFile(this);\"></td>
</tr>


</table>";

Однако скрипт отправляет обработчику массив из 5 элементов, даже если отправляю один файл. Больше 5 элементов скрипт тоже не отправляет.

Подскажите пожалуйста, как сделать чтобы можно было отправлять более 5 файлов?

Link to comment
Share on other sites

9 answers to this question

Recommended Posts

  • 0
Найти любое упоминание про 5 в коде и поставить там нужную цифру.
;)

Если бы все было так просто... я не нашел... поэтому и выложил вопрос вместе с кодом :)

Link to comment
Share on other sites

  • 0

Код формы

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=windows-1251" />
<title>Загрузка изображений</title>
<script>
function xdropFile(btn){
if(document.getElementById) {
tr = btn;
while (tr.tagName != 'TR') tr = tr.parentNode;
tr.parentNode.removeChild(tr);
xcheckForLast();
}
}
function xaddFile(btn){
if(document.getElementById) {
tr = btn;
while (tr.tagName != 'TR') tr = tr.parentNode;
var idSuffix = Math.round(Math.random()*1000);
var newTr = tr.parentNode.insertBefore(tr.cloneNode(true),tr.nextSibling);
thisChilds = newTr.getElementsByTagName('td');
for (var i = 0; i < thisChilds.length; i++){
if (thisChilds[i].className == 'header') thisChilds[i].innerHTML = '';
if (thisChilds[i].className == 'files') thisChilds[i].innerHTML = '<input size="32" name="xtt[]" class="wideFile" type="file">';
}
checkForLast();
}
}
function xcheckForLast(){
btns = document.getElementsByName('xdrop');
for (i = 0; i < btns.length; i++){
btns[i].disabled = (btns.length == 1) ? true : false;
}
}
</script>
</head>

<body>
<form action="obrabotka.php" method="post" name="form" ENCTYPE="multipart/form-data">
<?
echo "
<table width=20% align=center>
<tr>
<td width=\"20%\"><input type=\"file\" size=\"32\" name=\"xtt[]\"></td>
<td nowrap=\"nowrap\"><input type=\"button\" name=\"xdrop\" value=\" − \" onClick=\"xdropFile(this);\">
<input type=\"button\" value=\" + \" onClick=\"xaddFile(this);\"></td>
</tr>
</table>";
?>
<input name="" type="submit" />
</form>
</body>
</html>

Код обработчика

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml">

<head>

<meta http-equiv="Content-Type" content="text/html; charset=windows-1251" />

<title>Документ без названия</title>

</head>

<body>

<?

for($i=0;$i<count($_FILES['xtt']);$i++)

{

$uploaddir = 'foto/';

$uploadfile = $uploaddir . basename($_FILES['xtt']['name'][$i]);

if (move_uploaded_file($_FILES['xtt']['tmp_name'][$i], $uploadfile))

{ echo "Изображение №".$i." УСПЕШНО загружено.\n<br>";}

else { echo "Изображение №".$i." НЕ ЗАГРУЖЕНО!\n<br>";}

}

?>

</body>

</html>

Не могу понять где здесь ошибка?

Link to comment
Share on other sites

  • 0

Несовсем... почему-то массив xtt[] создается из пяти элементов, даже если загружаешь один файл! И при этом максимум можно отправить 5 файлов! Вот я и не могу понять как это исправить! Ограничений на 5 элементов не вижу ;)

Link to comment
Share on other sites

  • 0

Нашел ошибку!

Выкладываю исправленный скрипт... может кому пригодится

Форма

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=windows-1251" />
<title>Загрузка изображений</title>
<script>
function xdropFile(btn)
{
if(document.getElementById)
{
tr = btn;
while (tr.tagName != 'TR') tr = tr.parentNode;
tr.parentNode.removeChild(tr);
checkForLast();
}
}

function xaddFile(btn)
{
if(document.getElementById)
{
tr = btn;
while (tr.tagName != 'TR') tr = tr.parentNode;
var idSuffix = Math.round(Math.random()*1000);
var newTr = tr.parentNode.insertBefore(tr.cloneNode(true),tr.nextSibling);
thisChilds = newTr.getElementsByTagName('td');
for (var i = 0; i < thisChilds.length; i++)
{
if (thisChilds[i].className == 'header') thisChilds[i].innerHTML = '';
if (thisChilds[i].className == 'files') thisChilds[i].innerHTML = '<input size="32" name="xtt[]" class="wideFile" type="file">';
}
checkForLast();
}
}

function checkForLast()
{
btns = document.getElementsByName('xdrop');
for (i = 0; i < btns.length; i++)
{
btns[i].disabled = (btns.length == 1) ? true : false;
}
}
</script>
</head>

<body>

<form action="obrabotka.php" method="post" name="form" ENCTYPE="multipart/form-data" align="center">
<table width=20% align=center>
<tr>
<td width="20%"><input type="file" size="32" name="xtt[]"></td>
<td nowrap="nowrap">
<input type="button" name="xdrop" value=" −" onClick="xdropFile(this);">
<input type="button" value=" + " onClick="xaddFile(this);">
</td>
</tr>
</table>
<input name="" type="submit">
</form>

</body>
</html>

Обработка

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=windows-1251" />
<title>Документ без названия</title>
</head>

<body>

<?

for($i=0;$i<count($_FILES['xtt']['name']);$i++)
{
$uploaddir = 'foto/';
$uploadfile = $uploaddir . basename($_FILES['xtt']['name'][$i]);

if (move_uploaded_file($_FILES['xtt']['tmp_name'][$i], $uploadfile))
{ echo "Изображение №".$i." УСПЕШНО загружено.\n<br>";}
else { echo "Изображение №".$i." НЕ ЗАГРУЖЕНО!\n<br>";}
}

?>

</body>
</html>

Edited by Чебурашка
Link to comment
Share on other sites

  • 0

Рассматривая данную тему, пришел так же к проблеме, что на одной странице не может быть обработано более 20 (двадцати) тегов type=file.

Хотя, возможно, что проблема именно в суперглобальном массиве $_FILES, на которое (возможно) наложено ограничение в 20 элементов?

Т.е. нижеприведенный код при выборе, например, файла №22 не выведет имени загруженного файла, в то время, как выводит имя элемента, например, под номером 19 (если он указан).

<?php
for ($i=0;$i<$_POST['kol_vo'];++$i)
if ($_FILES["file_$i"]['name'])echo "$i -> ".$_FILES["file_$i"]['name']."<br>";

echo "<form action='' method=post ENCTYPE=multipart/form-data>
<input type=submit><br>";
for ($i=0;$i<25;++$i)
echo $i.". <input type=file name='file_".$i."'><br>";
echo "<input type=hidden name=kol_vo value='".$i."'></form>";
?>

Другими словами, count($_FILES['filename']['name']) является константой, равной 20.

Итак, вопрос: "Как расширить диапазон массива $_FILES?".

Link to comment
Share on other sites

  • 0

Здравствуйте всем кто заходит еще на эту тему, очень нужен такой код, но у меня не работает, я прописал папку для хранения файлов - вместо 'xtt' , что неправильно сделал подскажите пожалуйста.

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Answer this question...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

 Share

×
×
  • Create New...

Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue. See more about our Guidelines and Privacy Policy