Como fazer upload de arquivos no ASP sem usar componentes no servidor?
- 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.
- O formulário tem que ser submetido de um jeito especial, assim
<form action="arquivoquerecebeopost.asp" method="post" enctype="multipart/form-data">
- Na página que vai receber o post, você não pode usar
Request()
nemRequest.Form()
, apenasRequest.QueryString()
. - No começo da sua página, chame a função
upload_ReadRequest
- Onde precisar ler os valores do formulário, use
uRequest("nomedocampo")
- 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”.) - 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.
Olá, infelizmente o link de download do script não está ativo.
Procuro a muito tempo um upload sem script. Grande abraço.
Se o dono do blog permitir, segue abaixo o código pra redimensionar as imagens enquanto você envia:
Valeu.
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.
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 ?
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.
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.
Alguem resolveu esse problema do MidB ???????????????????????????????
Apenas para mostrar como ficou a declaração do meu form:
Pessoal, mais uma dica. Aqui o erro parou de acontecer depois que eu coloquei valor para a propriedade method do meu form (method=”post”).
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.
PHP eh chato, ASP da problemas…
larguem tudo e façam em Python!!
“Seus problemas se acabaram-se!”
O meu não deu certo ainda…
Ainda tá dando: Chamada de procedimento ou argumento inválido: ‘MidB’
Bom dia, eu encontrei a solução. O limite é do meu IIS. Reconfigurei e funcionou perfeitamente.
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?
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?
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… 🙁
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
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!
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.
O meu só ta funcionando no FF com o IE da erro 500
alguém sabe o q pode ser?
Bom dei uma olhada o problema não serias no MIDB ? o certo não seria somente MID.
Concordo com o Nemesis, eu ainda não resolvi o problema do upload e fico lendo post de briaga entre ASP e PHP. fica chato galera, vamos colaborar.
Obrigado.
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.
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!
olhem o codigo…
— codigo do form: UPLOAD.HTM —
— codigo q recebe o post: UPLOADING.ASP —
espero ter ajudado, qualquer dúvida entrem em contato: rafael@festlagos.com.br
Abraços a todos!
Como eu consigo capturar o tamanho (dimensão) da imagem para verificar se ela pode ser “upada” ?
e esse problema veio acontecer depois que eu reinstalei o iis!
putz, ninguem sabe como resolver o problema acima, não é permissao pois eu dei permissao na minha pasta e nao resolveu
Valeu
E o caminho pessoal!!! ohhhhhhhh!!!!
o ultimo ai do Ruy Says e permissao na pasta!!!!!
OKvaleu
Ae galera,
Alguem sabe como arrumo o erro abaixo?!
Microsoft VBScript runtime error ‘800a0046’
Permission denied
/upload.asp, line 151
Muito Obrigado!
o ENCTYPE=”multipart/form-data” não foi suficiente… Alguma outra manifestação???
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!)
Pessoal… alguém conseguiu resolver o prob. do pessoal acima??
Alguem conseguiu?
Quem conseguir posta uma parte do codigo pra a gente ver….
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…
Olha o título não é “SEM COMPONENTES” … porque estão dizendo para instalar componentes…. aiaiaiai…….
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!
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
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. ;-]
Ola galera, o erro do UPLOAD DESSES ARQUIVOS ai , é problema de Componente do Windows, intale-o e pronto !!!! Vai rodar…..
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.. :/
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.
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..
É, 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!
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?
Ué, mas porque?
Outra coisa, python da para fazer aplicativos para web? Obrigado
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.
sou mais via php hein… muito mais facil e melhor… no coments..