Suporte - FileUpload

Neste documento estaremos discutindo como fazer o envio de arquivos ao servidor (fileupload) da maneira mais tradicional e simples possível abordando as tecnologias mais usadas, entre elas o próprio HTML e o ASP Clássico.

Pretendo fazer a mesma tarefa com PHP e ASP NET mas ainda não desenvolvi este item no momento.

Isso significa que não iremos usar o file upload do jQuery. Note que o jQuery para fazer fileupload tem que ser disparado pelo lado do cliente e sendo assim bem mais vulnerável a ataques que o asp clássico onde uma página html aponta para o aquivo e uma página asp dentro do servidor realiza o fileupload.

Importante : Note que em momento nenhum temos qualquer autenticação de usuário ou qualquer mecanismo que barre o fileupload de arquivos para o nosso site. A segurança toda deste processo está baseada no fato que ela ocorre totalmente dentro do servidor web por componentes instalados no servidor web. É isto que faz a segurança ser 'razoável' mesmo para os dias de hoje.

Se você está usando asp clássico o fileupload está baseado num componente interno ao servidor e externo ao site asp para fazer essa tarefa. Como já enfatizei é um erro grave de segurança fazer upload de arquivos com componentes externos ao asp mas é assim que o asp clássico funciona, não há outro jeito e como é realizado por componentes internos ao servidor é relativamente seguro, mas só roda com trust-level=full.

No meu estudo tenho um site que me baseei para escrever este documento na iphotel e instalado no site tenho o componente Persits.Upload para fazer upload de arquivo. É como o CDONTS para envio de email ou ADO para acessar bases de dados. O que o ASP Clássico não consegue fazer ele utiliza componentes externos para fazê-los. Se você conhece PHP e as coisas lhe parecem muito semelhantes lhe garanto que não é mera coincidência. Como todo o processo roda dentro do servidor a coisa é relativamente segura , mas bem menos segura que os sites modernos.

Básicamente o fileUpload é feito por 2 páginas.

A primeira página é uma página html ou asp bem simples que tem :

Um form com um parâmetro especial para envio de arquivos :
enctype="multipart/form-data" e o parâmetro method deve ser obrigatóriamente method="post".

A coisa péssima do enctype="multipart/form-data" é que o form só fará o fileUpload, ou seja, se dentro desse form contiver outros controles tipo input type="text" ou coisa parecida, estes NÃO serão enviados ao servidor, só será feito o fileUpload.

A gente contorna esse problema colocando o fileupload dentro de um form e o envio de dados em outro form e um mecanismo que assegura que os arquivos foram enviados antes dos dados, isto se for necessário. O chato é que você tem que dar 2 submits no mesmo form para realizar a tarefa.

Um ou mais controles do tipo input type=file. Eles terão o nome dos arquivos do cliente a subir para o servidor.

E um botão tipo submit que envia o form. É mais fácil ver o código que ficar imaginando :

<html>
<body>
    <form method="post" enctype="multipart/form-data" action="envia.asp">
        <input type="file" name="arquivo1"><br>
        <input type="file" name="arquivo2"><br>
        <input type="file" name="arquivo3"><br>
        <br>
        <input type="submit" value="Enviar Arquivos">
    </form>
</body>
</html>

No exemplo acima fiz uma página para enviar 3 arquivos de cada vez. Se preencher só um ou dois não haverá problemas.

A segunda página no asp clássico é uma página asp que enviará os arquivos do cliente para o servidor.

Nessa segunda página alguns detalhes são importantes. O primeiro é o componente externo ao ASP a ser utilizado para fazer o fileupload. No meu exemplo, asp clássico, Persits.Upload.

A segunda coisa importante é a pasta de destino dos arquivos. No nosso site sempre fica mais elegante fazer referencias as pastas via estrutura do site. Por isso, se desejo enviar arquivos ao servidor crio uma pasta, no meu caso, fotos e faço o componente apontar para a pasta : server.mappath("/fotos").
Note que podemos fazer essa pasta destino ser determinada por um parâmetro ou mesmo um dado na session do asp.

Um simples comando save no componente fileupload faz o upload do arquivos. A página é a seguinte :

<%
Dim Upload,Pasta
Set Upload = Server.CreateObject("Persits.Upload")

if session("pastadestino") <> "" then
    Pasta = server.mappath(session("pastadestino"))
else
    Pasta = server.mappath("/fotos")        'pasta default
end if

n = Upload.Save(Pasta)    ' sobe os arquivos

if Err.Number <> 0 then        'ocorreu erro ?
    response.write("Ocorreu um erro ao enviar o(s) arquivo(s)")
    response.write("Número do erro : ")
    response.write(Err.Number)
    response.write("<br />")
    response.write("Mensagem do erro : ")
    response.write(Err.Description)
    response.write("<br />")
    response.end
else
    response.write n & " arquivo(s) foram enviados com sucesso."
end if

'Remove objeto Upload
Set Upload = nothing

if session("destino") <> "" then
    response.redirect(session("destino"))
end if
%>

E é assim que se faz o fileupload em asp classico.

Caso queira mais informações do componente Persits.Upload clique no a seguir : Site oficial ou Exemplo de uso