Olah, um upload eh arquivo eh algo bastante simples. Voce tem um boundary (q limita o comeco e final do arquivo), alguns cabecalhos com informacoes do arquivo e no meio vem o arquivao. Algo do tipo:
-------------------------------12345678 Content-Disposition: form-data; name="myfile"; filename="ad.gif" Content-Type: image/gif [conteudo do arquivo binario] -------------------------------12345678-- Todas essas informacoes vem em stdin. Regras: 1) Informacoes estao entre um boundary e o limite dele (o limite eh sempre o boundary + '--'); 2) Logo apos o boundary vem os cabecalhos, q sao separados do arquivo por uma linha em branco (conhecida sequencia \r\n\r\n no protocolo HTTP); 3) O resto eh o seu arquivo. Usar echo p/ trabalhar com arquivos binarios nao eh uma boa ideia. Mas o sed consegue fazer isso bem, entao, seguindo as regrinhas podemos montar um file uploader. --- uploader.sh --- #!/bin/bash # copia o upload inteiro de stdin p/ um arquivo temporario tmp_file=`mktemp` sed -n '1,$p' > $tmp_file # pegamos o boundary conforme o seu script boundary=$(export | sed '/CONTENT_TYPE/!d;s/^.*dary=//;s/.$//') # pegamos o nome do arquivo conforme o seu script * filename=$(sed -n '2!d;s/\(.*filename=\"\)\(.*\)\".*$/\2/;p' $tmp_file) # pegamos tudo q esta entre os boundary sed -n "/^$boundary$/,/^$boundary--$/ { /^$boundary$/d; /^$boundary--$/d; p; }" $tmp_file > "${tmp_file}_nobound" # removemos os cabecalhos e jogamos finalmente no arquivo # final sed '1,/^$/d; $d;' "${tmp_file}_nobound" > /tmp/$filename --- uploader.sh --- Ele deveria funcionar perfeitamente, nao fosse um pequeno detalhe. A ultima linha termina com \r\n e o sed nao remove ela. Nao sei como remover os 2 ultimos bytes de um arquivo em shell, talvez alguem da lista possa dizer. Outro detalhe eh q ele funciona perfeitamente se vc fizer upload de 1, e apenas 1 arquivo, p/ + arquivos voce vai ter q quebrar a cabeca 1 pouco. []s Humberto Pereira Giuseppe Fontana wrote: > Olá pessoal. Peguei um Script do Thobias Salazar Trevisan na Internet, > que faz Upload de arquivos em HTML com CGI. Mas para isso, eu não posso > usar o Perl, nem PHP, Python, apenas bash. > > O Script foi feito para enviar somente arquivos de texto, então queria > adaptar ele para enviar arquivos de conteúdo binário, como fotos, docs, etc. > > Pedi ajuda ao Flavio Torres, e ele coitado acabou perdendo dois dias > comigo tentando descobrir uma forma de enviar os dados. Inclusive > chegamos a conclusão que o Script só envia arquivos de texto. > > Abaixo vai os Scripts: > ---------------------------------------------------------------------------------------------------------- > Upload.htm > > <html> > <body> > <form enctype="multipart/form-data" action="/cgi-bin/upload.cgi" > method="post"> > Enviar arquivo: <input name="userfile" size="30" type="file"> > <BR><BR> > <input type="submit" value="Envia" name="Envia"> > </form> > </body> > </html> > ---------------------------------------------------------------------------------------------------------- > Upload.CGI > #!/bin/sh > > echo "<html><body><pre>" > # Limite > boundary=$(export | sed '/CONTENT_TYPE/!d;s/^.*dary=//;s/.$//') > > # pegamos toda a entrada do POST e colocamos em VAR > VAR=$(sed -n '1,$p') > > # pegamos o nome do arquivo que foi feito o upload > FILENAME=$(echo "$VAR" | sed -n '2!d;s/\(.*filename=\"\)\(.*\)\".*$/\2/;p') > > # pegamos somente o conteudo do arquivo do upload > FILE=$(echo "$VAR" | sed -n "1,/$boundary/p" | sed '1,4d;$d') > > # redirecionamos o conteudo do arquivo para um arquivo local no server > echo "$FILE" | sed '$d' > "/tmp/$FILENAME" > > echo "</pre></body></html>" > ---------------------------------------------------------------------------------------------------------- > > Qualquer opinião é bem vinda! > > Atenciosamente, > Giuseppe --------------------------------------------------------------------- Esta lista não admite a abordagem de outras liguagens de programação, como perl, C etc. Quem insistir em não seguir esta regra será moderado sem prévio aviso. --------------------------------------------------------------------- Sair da lista: [EMAIL PROTECTED] --------------------------------------------------------------------- Esta lista é moderada de acordo com o previsto em http://www.listas-discussao.cjb.net --------------------------------------------------------------------- Servidor Newsgroup da lista: news.gmane.org Grupo: gmane.org.user-groups.programming.shell.brazil Links do Yahoo! Grupos <*> Para visitar o site do seu grupo na web, acesse: http://br.groups.yahoo.com/group/shell-script/ <*> Para sair deste grupo, envie um e-mail para: [EMAIL PROTECTED] <*> O uso que você faz do Yahoo! Grupos está sujeito aos: http://br.yahoo.com/info/utos.html