LINUX.ORG.RU

upload нескольких файлов одновременно. rfc1867


0

0

Надо сделать простую штуку: пользователь выбирает пачку файлов, после чего жмакает «отправить» и становится счастливым. На практике надо постоянно тыкать в <INPUT TYPE=FILE> и выбирать файл по 1 штуке.

Сейчас читаю rfc1867, а там интересный пример...

     <FORM ACTION="http://server.dom/cgi/handle"
           ENCTYPE="multipart/form-data"
           METHOD=POST>
     What is your name? <INPUT TYPE=TEXT NAME=submitter>
     What files are you sending? <INPUT TYPE=FILE NAME=pics>
     </FORM>

   and the user types "Joe Blow" in the name field, and selects a text
   file "file1.txt" for the answer to 'What files are you sending?'

   The client might send back the following data:

        Content-type: multipart/form-data, boundary=AaB03x

        --AaB03x
        content-disposition: form-data; name="field1"

        Joe Blow
        --AaB03x
        content-disposition: form-data; name="pics"; filename="file1.txt"
        Content-Type: text/plain

         ... contents of file1.txt ...
        --AaB03x--

   If the user also indicated an image file "file2.gif" for the answer
   to 'What files are you sending?', the client might client might send
   back the following data:

        Content-type: multipart/form-data, boundary=AaB03x

        --AaB03x
        content-disposition: form-data; name="field1"

        Joe Blow
        --AaB03x
        content-disposition: form-data; name="pics"
        Content-type: multipart/mixed, boundary=BbC04y

        --BbC04y
        Content-disposition: attachment; filename="file1.txt"
        Content-Type: text/plain

        ... contents of file1.txt ...
        --BbC04y
        Content-disposition: attachment; filename="file2.gif"
        Content-type: image/gif
        Content-Transfer-Encoding: binary

          ...contents of file2.gif...
        --BbC04y--
        --AaB03x--

Я не понял - этот RFC так и не приняли? Я понимаю, что Category: Experimental, поэтому бы и хотелось прояснить этот момент, используется ли где-то такая штука.

судя по тому что все делают через java applet или flash - не работает оно.

vahvarh ★★★
()

работает это, по крайней мере IE точно данные умеет так отправлять, перловый CGI точно умеет такие данные получать

borisych ★★★★★
()
Ответ на: комментарий от borisych

м... А что надо сделать, дабы ИЕ позволил выделить сразу несколько файлов? Я такого никогда не видел.

А интересуюсь потому, что сейчас я поверх перла изобретаю собственный похапе, причем без CGI.pm (надоели его ограничения), с забавами и барышнями.

EmStudio
() автор топика

	    <form method="POST" enctype="multipart/form-data" action="/upload">

	    <table>
	    <tr>
		<td>
		    <input type=file name=userfile[] size=40>
		</td>
		<td valign=bootom >
		    <input type="button" name="drop" value=" - " onClick="if(document.getElementById) dropFile(this);"> <input type="button" value=" + " onClick="if(document.getElementById) addFile(this);">
		</td>
	    </tr>
	    <tr>
		<td colspan=2 >
		    <input type=submit value=" Добавить">
		</td>
	    </tr>
	    </table>
	    </form>


	    <script language="Javascript">
	    <!--

		function dropFile(btn) {
    
		    tr = btn;
		    while (tr.tagName != 'TR') tr = tr.parentNode;
		    tr.parentNode.removeChild(tr);
		    checkForLast();
		}
    
		function addFile(btn){
    
		    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 = '';
		    }
	
		    checkForLast();
		}
    
		function checkForLast(){
    
		    btns = document.getElementsByName('drop');
		    for (i = 0; i < btns.length; i++){
			btns[i].disabled = (btns.length == 1) ? true : false;
		    }
		}
    
		if(document.getElementById) checkForLast();
    
		-->
		</script>

phasma ★☆
()
Ответ на: комментарий от EmStudio

<form>
<INPUT TYPE=FILE NAME=file3>
<INPUT TYPE=FILE NAME=file2>
<INPUT TYPE=FILE NAME=file1>
<INPUT TYPE=SUBMIT>
</form>

только выглядит крайне убого и вообще не очень удобно, если файлов >3, собственно поэтому и предпочитают любо flash, либо applet

borisych ★★★★★
()
Ответ на: комментарий от EmStudio

> Сабжевый RFC ниасилил? Это про это сказка.

если и есть поддержка, то скорее только в опере и w3m

phasma ★☆
()
Ответ на: комментарий от EmStudio

этот rfc описывает способ для отправки пачки файлов при помощи method="post" enctype="multipart/form-data". собственно, сейчас так все и работает. правда из примера не очевидно, что для каждого из 'input type="file"' пользователь может выбрать лишь один единственный файл (см. раздел про безопасность). чтобы отправить несколько файлов, форма должна содержать соответствующее кол-во input type="file". если это и баг, то он относится к юзабилити, а не протоколу.

Lucky ★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.