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

 


Responder a