|
|
|
| Приветствую!
Есть форма
<form name="Zagryzka" action="../Zagryzka_faula.php" target="Zagryzka" method="post"enctype="multipart/form-data">
<fieldset class = "ramka_Z"><legend align="center">ЗАГРУЗКА ФАЙЛА</legend>
<div class = "div_vf">
<input type="file" name="userfile" id="file">
<input type="button" onclick= "document.Zagryzka.userfile.click();" value = "ВЫБЕРИТЕ ФАЙЛ" class = 'but_vf'>
</div>
<input type="button" value="ЗАГРУЗИТЬ" onclick="fv_Zagryzka1();" class = 'but_zag'>
</fieldset>
</form>
|
и функция оправляющая форму скрипту загрузки
function fv_Zagryzka1() //загрузка файла
{
var str = "menubar=0,location=0,resizable=0,scrollbars=0,";
str += "status=0,titlebar=no,toolbar=0,left=0,";
str += "top=0,width=400,height=300";
myWindow1 = window.open("", "Zagryzka", str);
document.Zagryzka.submit();
}
|
Суть проблемы: после обработки скриптом полученная HTML страница должна вкладываться в новом окне с именем "Zagryzka", как указанно в target формы. Прекрасно работает в Mozila, Chrom,Opera , но IE пустое окно. Что не так? | |
|
|
|
|
|
|
|
для: mikado3333
(26.08.2013 в 09:54)
| | В каком именно?
И:
method="post"enctype="multipart/form-data" - гарантированный баг в IE, нет пробела
form name="Zagryzka", window.open("", "Zagryzka", str); - нет фантазии на другие имена? IE может на законных основаниях и закрыть доступ к объекту.
action="../Zagryzka_faula.php" - стоит ли использовать регистр на платформе, где он имеет значение?
<input type="button" onclick= "document.Zagryzka.userfile.click();" value = "ВЫБЕРИТЕ ФАЙЛ" class = 'but_vf'> - это для чего, типа "красивое поле" file сделать? | |
|
|
|
|
|
|
|
для: confirm
(26.08.2013 в 10:34)
| | Поправил первые три Ваших замечания - результат не изменился.
По поводу <input type="button" onclick= "document.Zagryzka.userfile.click();" value = "ВЫБЕРИТЕ ФАЙЛ" class = 'but_vf'> - действительно красивое поле сделать :-).
В итоге без изменения | |
|
|
|
|
|
|
|
для: mikado3333
(26.08.2013 в 11:50)
| | Поэкспериментировал похоже IE не может "переварить" скрипт загрузки.
Сам скрипт
<?
$date = date("dmY"); /////////////////////////////// ДАТА И ВРЕМЯ
$time = date("His");
$number = '144';
$max_filesize = 104857600; // Максимальный размер загружаемого файла в байтах (в данном случае он равен 100 Мб).
$upload_path = "../all/files/$number/"; // Место, куда будут загружаться файлы (в данном случае это папка 'files').
$filename = $_FILES['userfile']['name']; // В переменную $filename заносим точное имя файла (включая расширение).
$nomer_str = strripos($filename, '.'); //последнее вхождение точки
$exe = substr($filename, $nomer_str) ; // получим расширение
//////////////////////////////////////////////////////////////////////////ОКНО//////////////////////////////////////////////////////////////////////////////////////
// Теперь проверим размер загруженного файла и если он больше максимально допустимого, то прерываем выполнение программы и выдаем сообщение.
if(filesize($_FILES['userfile']['tmp_name']) > $max_filesize)die('Фаил слишком большой.');
// Проверяем, доступна ли на запись папка, определенная нами под загрузку файлов (папка files). Если вдруг недоступна, то выдаем сообщение, что на папку нужно поставить права доступа 777.
if(!is_writable($upload_path)) {mkdir("../all/files/$number/", 0777);} ///// Загружаем фаил в указанную папку.
if(move_uploaded_file($_FILES['userfile']['tmp_name'],$upload_path . $filename))///////////////////ОТПРАВКА ФАЙЛА
{
/////////////////////////////////////////////////////переминовывание файла//////////////////////////////////////
$_1=$upload_path.$filename;
$_2=$date.'('.$time.')-'.'file'.$exe;
$rename=$upload_path.$_2;
rename ("$_1" , "$rename");
/////////////////////////////ФОРМИРОВАНИЕ ТЕКСТА ОКНА.///////////////////////////////////////////////////////////////////////
echo '  Ваш фаил успешно загружен!';
echo '<br> Нажмите кнопку "ССЫЛКА" и текст содержащий <br> ссылку на Ваш файл появится в поле ответ, автоматически.
<br> Если Вы ошиблись с выбором файла просто сотрите ссылку
из поля ответ и повторите процедуру загрузки. <br> <br>','<span style = "color:red">','<a href="' . $rename . '">',$filename,'</a>','</span>';
}
else
{
echo 'При загрузке возникли ошибки. Попробуйте ещё раз.';
}
?>
<script type="text/javascript">
<!--
function Z() //////// ДОБАВЛЕНИЕ ССЫЛКИ В ПОЛЕ ОТВЕТ
{
window.opener.document.getElementById("txt").value= window.opener.document.getElementById("txt").value + "<? echo '\n <a href=\"' . $rename . '\" style = \"color:#00ffff;font-size:0.8em;font-weight:bolder;\" onclick = \"signal = 1;\">',$filename,'</a>';?>";
self.close();
}
//-->
</script>
<input type="button" value="ССЫЛКА" onclick="Z();">
|
| |
|
|
|
|
|
|
|
для: mikado3333
(26.08.2013 в 12:13)
| | Рекомендация - выбросить. В сети описана загрузка файлов "аля-ajax" использующая фрейм, и это лучше. К тому же, некогда вы сказали, что рассчитываете именно на современные браузеры, а они (IE начиная с версии 10) обеспечивают загрузку файлов объектом XMLHttpRequest(), без всех этих выкрутасов. | |
|
|
|
|
|
|
|
для: mikado3333
(26.08.2013 в 11:50)
| | Вы не ответили в каком именно IE такое получается. Например, если из под IE10 проверять, то с учетом изменений все будет работать.
А вообще, никогда такого делать не стоит, так необдуманно именовать объекты. Вот просто пример, который часто приводится в сети. Выполните его в IE:
<html>
<head>
<meta http-equiv="X-UA-Compatible" content="IE=8" />
</head>
<body>
<div id="main"></div>
<script>
main = "Message";
alert(main);
</script>
</body>
</html>
| и вы ни за что не получите сообщения, если не переименуете переменную, или не используете директиву var для ее объявления, или не укажите другое id у DIV.
Для того чтобы сделать приличный и одинаковый во всех браузерах input type=file, совсем не нужен еще один input, он по большому счету бесполезен. Способы стилизации его описаны в сети, есть и очень простые.
И последнее - для чего это все, типа "ajax" загрузку файла сделать? | |
|
|
|
|
|
|
|
для: confirm
(26.08.2013 в 12:24)
| | Проверяю в IE8 установленный на Windows7. Не совсем понял ваш вопрос -
И последнее - для чего это все, типа "ajax" загрузку файла сделать?
Если Вы имели ввиду сделать "ajax" загрузку с <frame> ,вместо того что бы "мудрить". То скорее всего так и сделаю. Просто "хотца" докопаться что же не нравится этому IE8. | |
|
|
|
|
|
|
|
для: mikado3333
(26.08.2013 в 12:52)
| | В вашем случае нет никакой ajax-загрузки файла, и открываемое вами окно, это ответ сервера о результатах загрузки, то есть элемент диалога сервер-клиент. А какой смысл иметь форму отправки в одном окне, а вести диалог в другом? Поэтому лучше IFRAME. | |
|
|
|
|
|
|
|
для: confirm
(26.08.2013 в 13:04)
| | Идея была в создании пред просмотра и только после того как человек убедился что это ТОТ файл давал на него ссылку в ответе. | |
|
|
|
|
|
|
|
для: mikado3333
(26.08.2013 в 13:14)
| | Лучше в этом случае поступать по другому - для новых браузеров делать и предпросмотр, и даже чашечку кофе предлагать, а для всякой рухляди сообщение - "Увы и ах, но ваш браузер такая рухлядь, что сервер отказывается вам показывать то, что вы пытаетесь всучить ему. Обновите свой браузер по ссылке <a href=...>, или установите любой из альтернативных по ссылкам <a href=...>, <a href=...>, ..., иначе мы вам можем предложить только чай, без лимона."
Пора разработчикам насильно заставлять выбрасывать пользователей свою рухлядь в помойку, а не угождать каждому за счет излишней кучи кода, стилей и прочей лабуды.
Вот пример Ajax загрузки файла (я его написал не проверяя, если что, то ошибки можно и исправить). Код позволяет производить предпросмотр выбранного файла не за счет сервера, а с помощью возможностей предоставляемых HTML5.
<!DOCTYPE HTML>
<html>
<head>
<style>#hldr img{width:320px;height:auto}</style>
<script>
function sendForm(f) {
var fd = !!window.FormData, fl = false;
if(fd) {
var dt = new FormData();
for(var i=0, k=f.length; i<k; i++) { //обход элементов формы и добавление их в FormData
if(f[i].type=='file' && f[i].value) {dt.append(f[i].name, f[i].files[0]); fl = true;} //добавление файла
else if(f[i].type!='file' && f[i].name) dt.append(f[i].name, f[i].value); //добавление остальных полей формы
}
} else {
//с отправкой файла, но минуя Ajax
}
var xhr = new XMLHttpRequest();
xhr.open('POST', 'post.php', true);
xrn.setRequestHeader("X_REQUESTED_WITH", "XMLHttpRequest");
if(fd) { //если поддерживается Ajax загрузка и предпросмотр
xhr.onload = function() {
document.getElementById('prgs').value = 100; document.getElementById('prgm').innerHTML = '100% загружено'; //прогресс загрузки файла
if (xhr.status == 200) requestSend(xhr.responseText); //отправка результата в обработчик
}
} else { //иначе отправка формы без файла
xhr.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
xhr.onreadystatechange = function() {
try {
if(xhr.readyState == 4) {
if (xhr.status == 200) requestSend(xhr.responseText); //отправка результата в обработчик
}
} catch(e) {}
}
}
if(fl) { //отображение прогресса загрузки файла
document.getElementById('prgs').value = 0; document.getElementById('prgm').innerHTML = '0% загружено';
xhr.upload.onprogress = function(event) {
if (event.lengthComputable) {
var v = Math.round(event.loaded/event.total*100);
document.getElementById('prgs').value = v; document.getElementById('prgm').innerHTML = v+'% загружено';
}
}
}
xhr.send(dt);
return false;
}
function preview(f) { //предпросмотр загружаемого файла, имеется ввиду изображение
if(!!window.FileReader) {
var reader = new FileReader(), hld = document.getElementById('hldr');
hld.innerHTML = '';
reader.onload = function(event) {
var im = new Image();
im.src = event.target.result;
hld.appendChild(im);
}
reader.readAsDataURL(f)
}
}
</script>
</head>
<body >
<form onsubmit="sendForm(this.elements)">
<input type="file" onchange="preview(this.files[0])" />
<input type="submit" value="Send" />
</form>
<progress id="prgs" max="100" value="0"></progress> <span id="prgm"></span>
<div id="hldr"></div>
</body>
</html>
|
Новая реализация XMLHttpRequest позволяет производить и мульти загрузку файлов. | |
|
|
|
|