Upload ASP sem componentes

Como fazer upload de arquivos no ASP[bb] sem usar componentes no servidor?

  1. Baixe esse arquivo: upload.asp.zip e descompacte em seu servidor. Eu costumo deixar arquivos como esse, que só contém funções genérica, na pasta /api no servidor, de onde eu posso fazer um include virtual em todas as aplicações em que precisar.
  2. O formulário tem que ser submetido de um jeito especial, assim <form action="arquivoquerecebeopost.asp" method="post" enctype="multipart/form-data">
  3. Na página que vai receber o post, você não pode usar Request() nem Request.Form(), apenas Request.QueryString().
  4. No começo da sua página, chame a função upload_ReadRequest
  5. Onde precisar ler os valores do formulário, use uRequest("nomedocampo")
  6. Para salvar o arquivo: upload_SalvaArquivo "nome_do_campo_file", "C:\Caminho\PodeUsarServerMapPathSeQuiser\", "nomedoarquivo.jpg", "jpg". O último parâmetro é uma lista das extensões permitidas (algo como “doc,txt,rtf,pdf”.)
  7. Se quiser obter o nome do arquivo, use UploadRequest.Item("nome_do_campo_file").Item("FileName"). Vem o caminho completo, você precisa tratar a string se quiser apenas o nome. Isso não é difícil, eu costumo fazer com split.

Exemplo de código.

Publicado por

Elcio

Elcio é sócio fundador da Visie Padrões Web. Pioneiro no uso e divulgação dos padrões do W3C no Brasil, Elcio já treinou equipes de dezenas de empresas como Globo.com, Terra, Petrobras, iG e Locaweb. Além disso, tem dirigido as equipes da Visie no desenvolvimento de projetos web para marcas como Brastemp, Itaú Unibanco, Johnson & Johnson e Rede Globo.

48 comentários em “Upload ASP sem componentes”

  1. Boa noite pessoal, primeiramente parabéns Rafael, muuuuito bom o código, faz muito tempo que procuro por uma solução como esta e graças ao seu código consegui resolver um problemaço.

    Galera, pra resolver o problema de MidB vocês tem que saber qual a versão do IIS que estão usando, em seguida vejam na internet como alterar o valor dos arquivos que podem ser enviados, no IIS 7, é muito fácil, se precisarem de ajuda pode me chamar por msn luizricardofc@msn.com.

    Este problema de MidB é pq o arquivo é muito grande para o que é permitido, eu já passei por isso e resolvi aumentando o tempo limite de script e também o tamanho do arquivo a ser enviado.

    Novamente obrigado.

  2. O codigo funciona. Porém ao fazer o upload dos arquivos, os mesmos tem a extenção renomeada com um “M” no final. Tipo : “docM, txtM”.

    O que será que está acontecedo ?

  3. Excelente código, funcionou 100%. Fiz algumas alterações que achei importante para o controle da minha empresa. Com a sua solução, resolvi o problema de incompatibilidade do software AspUpload com o Windows 64 bits, quer dizer, não preciso mais dele. Parabéns e muito sucesso.

  4. Acho que o pessoal esta leigo demais por o codigo funciona direitinho, quero aproveitar é dizer o muito obrigado para o autor, nunca vi coisa tão simples e facil de usar. Sucesso!!!, queria saber se você tem outro que remenciona a foto automaticamente na pagina de resultado. quero dizer eu vou colocar o tamanho do quadro por exemplo 150 x 75, e a foto se ajustasse em ficar com distoção.

  5. Pessoal, mais uma dica. Aqui o erro parou de acontecer depois que eu coloquei valor para a propriedade method do meu form (method=”post”).

  6. Olá pessoal, já realizei todos os procedimentos acima e continuo com o memso erro da maioria aí:
    Erro de tempo de execução do Microsoft VBScript erro ‘800a0005’
    Chamada de procedimento ou argumento inválido: ‘MidB’
    /comercialnorte/upload.asp, line 13

    Alguém já tem uma nova solução?
    Desde já agradeço.

  7. O meu também funcionou, porém, ele tem um limite de upload de arquivo que é por volta de 200k. Tem alguma configuração que eu possa fazer para alterar este limite?

  8. O meu deu certinho de primeira, mas o único problema é que ele grava o texto com uma formatação estranha. tipo, quando é acento (á) por exemplo, ao invés de ele gravar á que seria o normal em HTML, ele grava “Ô… daí quando mostro ele como texto na página aparece normal, mas quando vou editar, no formulário ele aparece todo zuado.. alguém pode ajudar?

  9. infelizmente pra mim, continua dando o erro citado acima do MidB.
    Estou desesperado, pois esta pareceu a melhor forma de fazer isso até agora e simplesmente não funciona… 🙁

  10. eu tb copiei e colei o código e deu o mesmo erro, porem é soh inserir um “&” que resolve. a linha fica assim: if right(imagens,1) & “\” then

    Erro de compilação do Microsoft VBScript (0×800A03F9)
    ‘Then’ esperado
    /sites/pil/uploading.asp, line 108, column 19
    if right(imagens,1)”\” then

  11. Ae Jean..
    dei ctrl + v ai no seu código e não funcionou 🙁

    deu o seguinte erro:

    Erro de compilação do Microsoft VBScript (0x800A03F9)
    ‘Then’ esperado
    /sites/pil/uploading.asp, line 108, column 19
    if right(imagens,1)”\” then

    ai la no codigo essa linha fala q é o caminho onde vai salvar.

    obrigado!

  12. Ae galera… consegui como o Rafael em cima citou, mas não funcionou no server q eu uso, ai coloquei o conteudo da pagina upload.asp e funcionou perfeitamente, ficou assim:
    <%
    ‘ Author Philippe Collignon
    ‘ Email PhCollignon@email.com
    ‘ Modificado por Elcio Ferreira

    Dim UploadRequest,filename
    Set UploadRequest = CreateObject(“Scripting.Dictionary”)

    Sub BuildUploadRequest(RequestBin)
    ‘Get the boundary
    PosBeg = 1
    PosEnd = InstrB(PosBeg,RequestBin,getByteString(chr(13)))
    boundary = MidB(RequestBin,PosBeg,PosEnd-PosBeg)
    boundaryPos = InstrB(1,RequestBin,boundary)
    ‘Get all data inside the boundaries
    Do until (boundaryPos=InstrB(RequestBin,boundary & getByteString(“–“)))
    ‘Members variable of objects are put in a dictionary object
    Dim UploadControl
    Set UploadControl = CreateObject(“Scripting.Dictionary”)
    ‘Get an object name
    Pos = InstrB(BoundaryPos,RequestBin,getByteString(“Content-Disposition”))
    Pos = InstrB(Pos,RequestBin,getByteString(“name=”))
    PosBeg = Pos+6
    PosEnd = InstrB(PosBeg,RequestBin,getByteString(chr(34)))
    Name = getString(MidB(RequestBin,PosBeg,PosEnd-PosBeg))
    PosFile = InstrB(BoundaryPos,RequestBin,getByteString(“filename=”))
    PosBound = InstrB(PosEnd,RequestBin,boundary)
    ‘Test if object is of file type
    If PosFile0 AND (PosFile<PosBound) Then
    ‘Get Filename, content-type and content of file
    PosBeg = PosFile + 10
    PosEnd = InstrB(PosBeg,RequestBin,getByteString(chr(34)))
    FileName = getString(MidB(RequestBin,PosBeg,PosEnd-PosBeg))
    ‘Add filename to dictionary object
    UploadControl.Add “FileName”, FileName
    Pos = InstrB(PosEnd,RequestBin,getByteString(“Content-Type:”))
    PosBeg = Pos+14
    PosEnd = InstrB(PosBeg,RequestBin,getByteString(chr(13)))
    ‘Add content-type to dictionary object
    ContentType = getString(MidB(RequestBin,PosBeg,PosEnd-PosBeg))
    UploadControl.Add “ContentType”,ContentType
    ‘Get content of object
    PosBeg = PosEnd+4
    PosEnd = InstrB(PosBeg,RequestBin,boundary)-2
    Value = MidB(RequestBin,PosBeg,PosEnd-PosBeg)
    Else
    ‘Get content of object
    Pos = InstrB(Pos,RequestBin,getByteString(chr(13)))
    PosBeg = Pos+4
    PosEnd = InstrB(PosBeg,RequestBin,boundary)-2
    Value = getString(MidB(RequestBin,PosBeg,PosEnd-PosBeg))
    End If
    ‘Add content to dictionary object
    UploadControl.Add “Value” , Value
    ‘Add dictionary object to main dictionary
    UploadRequest.Add name, UploadControl
    ‘Loop to next object
    BoundaryPos=InstrB(BoundaryPos+LenB(boundary),RequestBin,boundary)
    Loop
    End Sub

    ‘String to byte string conversion
    Function getByteString(StringStr)
    For i = 1 to Len(StringStr)
    char = Mid(StringStr,i,1)
    getByteString = getByteString & chrB(AscB(char))
    Next
    End Function

    ‘Byte string to string conversion
    Function getString(StringBin)
    getString =””
    For intCount = 1 to LenB(StringBin)
    getString = getString & chr(AscB(MidB(StringBin,intCount,1)))
    Next
    End Function

    Function MontaTipo(strPath)
    Dim intpos
    intpos = InStrRev(strPath, “\”, Len(strPath) – 1)
    MontaTipo = Mid(strPath, intpos + 1, Len(strPath) – intpos – 1)
    End Function

    ‘Preenche o dicionário UploadRequest para que se possa
    ‘ler os campos através dele.
    Function upload_ReadRequest
    Response.Expires=0
    Response.Buffer = TRUE
    Response.Clear
    byteCount = Request.TotalBytes
    RequestBin = Request.BinaryRead(byteCount)
    BuildUploadRequest RequestBin
    End Function

    ‘Salva um arquivo por upload em caminho se for de um dos
    ‘tipos em ExtensoesPermitidas (string no formato
    ‘”jpg,jpeg,gif”)
    ‘Para salvar com o mesmo nome do envio, passe uma String
    ‘vazia para nome.
    Function upload_SalvaArquivo(Campo,Caminho,Nome,ExtensoesPermitidas)

    ‘Segurança (bastante óbvio, não?)
    EstensoesProibidas=”,exe,asp,php,sql,bat,pif,ocx,dll,aspx,shtml,”
    ExtensoesPermitidas=”,” & ExtensoesPermitidas & “,”

    ‘Onde salvar
    strPath = Caminho
    if right(strPath,1)”\” then
    strPath=strPath&”\”
    end if

    ‘Caminho original do arquivo.
    filepathname = UploadRequest.Item(Campo).Item(“FileName”)

    ‘Obtém a extensão
    For i = Len(filepathname) To 1 Step -1
    If Mid(filepathname, i, 1) = “.” Then Exit For
    Next
    extensao = Right(filepathname, Len(filepathname) – i)

    ‘Verifica se a extensão é dos tipos permitidos.
    if ExtensoesPermitidas=”,*,” then
    pode=(InStr(extensao,EstensoesProibidas)=0)
    else
    pode=(InStr(extensao,EstensoesPermitidas)>0)
    end if

    if pode then

    ‘On Error Resume Next

    value = UploadRequest.Item(Campo).Item(“Value”)

    ‘Create FileSytemObject Component
    Set ScriptObject = Server.CreateObject(“Scripting.FileSystemObject”)

    ‘Cria a pasta se ela não existir
    if not ScriptObject.FolderExists(strPath) then ScriptObject.CreateFolder(strPath)

    ‘Obtém o nome do arquivo a salvar
    filename = Nome
    if filename=”” then
    For i = Len(filepathname) To 1 Step -1
    If Mid(filepathname, i, 1) = “\” Then Exit For
    Next
    filename = Right(filepathname, Len(filepathname) – i)
    end if

    ‘Create and Write to a File (WARNING: Overwrites existing!)
    pathfilename = strPath & filename
    Set MyFile = ScriptObject.CreateTextFile(pathfilename,true)

    For i = 1 to LenB(value)
    MyFile.Write chr(AscB(MidB(value,i,1)))
    Next

    MyFile.Close

    ‘ verificar se imagem foi enviada com sucesso.
    if Err.number = 0 then
    msgEnvio=”Enviado com sucesso!”
    else
    msgEnvio=”Ocorreu um erro no envio!”
    end if
    Err.Clear
    else
    msgEnvio=”Extensão inválida!”
    end if

    upload_SalvaArquivo=msgEnvio

    end function

    function uRequest(n)
    uRequest=””
    if UploadRequest.Exists(n) then uRequest=UploadRequest.Item(n).Item(“Value”)
    end function

    %>

    Valeu Rafael.

  13. Esse topico é para falar do UPLOAD ou da briga do ASP e PHP?

    Se você é pinguim e deseja falar mal do ASP, azar o seu.
    Se você é microsoft e deseja falar mal dos Pinguins, azar o seu.
    Portanto, favor para auxiliar a vida de pessoas que querem aprender colaborem com o seu melhor código, seja na linguagem que for, existe mercado e sevidores para todos.

    Obrigado.

  14. bom, como o codigo não saiu no post anterior, mando novamente…
    — codigo do form: UPLOAD.HTM —
    <form action=”uploading.asp” method=”post” enctype=”multipart/form-data”>
    <input type=file name=”imagem”>
    <BR>
    <input type=submit>
    </form>

    — codigo q recebe o post: UPLOADING.ASP —
    <!– #include file=”upload.asp” –>
    <%
    ‘Lê o formulário
    upload_ReadRequest

    ‘Obtém nome e email
    ‘nome=uRequest(“nome”)
    ‘email=uRequest(“email”)

    ‘Obtém o nome do arquivo
    imagem = UploadRequest.Item(“imagem”).Item(“FileName”)
    splitimagem = split(imagem,”\”)

    for i = 0 to ubound(splitimagem)
    imagem = splitimagem(i)
    next

    response.write imagem

    ‘Salva o arquivo (Campo,Caminho,Nome,Extensao)
    upload_SalvaArquivo “imagem”, Server.MapPath(“./”), imagem, “jpg”
    ‘OBS: no ServerMapPath eu uso “./” para me referir à mesma pasta em que os arquivos estão.

    ‘Daqui em diante faz o que tem que fazer com o nome, email, etc…

    %>

    espero ter ajudado, qualquer dúvida entrem em contato: rafael@festlagos.com.br

    Abraços a todos!

  15. Ae galera,
    Alguem sabe como arrumo o erro abaixo?!

    Microsoft VBScript runtime error ‘800a0046’

    Permission denied

    /upload.asp, line 151

    Muito Obrigado!

  16. Para resolver o problema do
    “Chamada de procedimento ou argumento inválido: ‘MidB’”
    verifique se está colocando atributo ENCTYPE=”multipart/form-data” na tag FORM (como foi explicado e negritado pelo autor do artigo!)

  17. O upload funciona sim…é só colocar os campo da sub de forma correta q ela funciona direitinho.
    Muito facinho de usar…..ah…..nao precisa de componente nenhum msm…

  18. Anderson | June 13th, 2006 at 9:58

    Ola galera, o erro do UPLOAD DESSES ARQUIVOS ai , é problema de Componente do Windows, intale-o e pronto !!!! Vai rodar…..

    Anderson, que componente é esse, como instalar?
    Valew!

  19. O asp possui uma sintaxe muito mais simples, o que é melhor para pessoas que nunca programaram. O problema de instalar componentes do windows na máquina, é que só vai rodar na máquina, depois que hospedar no servidor, vai ser um rolo. não tem algum jeito de fazer upload direto no código? e qual a sintaxe? obrigado

  20. Até hj não encontrei nada q o PHP faça que o ASP não faça..
    Vale lembrar que não existe apenas uma maneira de realizar a mesma tafera. ;-]

  21. Fábio, eu realmente não acho que depende não… primeiro: asp não tem controle de escopo… se eu tiver uma classe

    Class Group
    public function addUser(id)
    set usr = new User
    usr.get(login)
    end function
    End Class

    e quiser fazer algo assim:

    usr = new User
    usr.get(“tevaum”)

    grp = new Group
    grp.get(“Admin”)
    grp.addUser(“marcos”)

    response.write usr.login ‘isso irá escrever “marcos” na tela, por mais incrível que pareça.. :/

  22. Esse negócio de PHP é melhor que ASP depende caras. Com as duas você pode fazer praticamente a mesma coisa, tudo bem que com ASP é um pouco mais dificil, mas pra trabalhar em ambiente Windows eu acho ela melhor.

  23. Erro de tempo de execução do Microsoft VBScript (0x800A0005)
    Chamada de procedimento ou argumento inválido: ‘MidB’
    / caminho /upload.asp, line 13

    O meu ocorre o mesmo erro que o da galera…
    Alguem sabe a resposta??
    VALEU..

  24. É, o meu está dando esse mesmo erro :

    Microsoft VBScript runtime error ‘800a0005′
    Invalid procedure call or argument: ‘MidB’
    /[… caminho …]/upload.asp, line 13

    Alguem atualiza o blog?!?!

    Valeu!

  25. tentei fazer e deu esse erro abaixo:

    Microsoft VBScript runtime error ‘800a0005’
    Invalid procedure call or argument: ‘MidB’
    /[… caminho …]/upload.asp, line 13

    o q pode ser? como resolver?

  26. Sim, realmente, fazer coisas como enviar email, upload de arquivos, rodar scripts no servidor, PHP é muito melhor que ASP. O problema é que a gente nem sempre pode escolher em que linguagem vai trabalhar. Se pudesse, faria tudo com Python.

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *