Bom dia estou tentando utilizar um script em asp para o upload de arquivos para o servidor sem a utilização de componentes, porém estou recebendo o seguinte erro:
Microsoft VBScript runtime error '800a01a8'
Object required: 'myRequestFiles'
/upload.asp, line 191
O problema é que o arquivo não tem 191 linhas , tem 148 linhas, porém o problema se refere também a um objeto, o myRequestFiles, que está presente no código, porém o que acredito que está acontecendo é que ou o valor do myRequestFiles não está sendo passado corretamente, ou tem algum erro de programação. Bem copiei o código para o upload sem componentes daqui do forum...fiz um copy&paste e o problema persiste, gostaria, se possível alguém aqui me desse uma mão.
Bom o formulário parte de contato.asp:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<!-- #include file = "upload_funcoes.asp" -->
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Untitled Document</title>
<link href="css/teste3.css" rel="stylesheet" type="text/css" />
<script language="JavaScript">
<!--
self.name = "contato";
//-->
</script>
</head>
<body>
<div id="cabecalhoesquerda"></div><div id="cabecalho"></div>
<div id="clear"></div>
<div id="esquerda"></div>
<form method="post" enctype="multpart/formdata" name="form1" action="http://www.meudominio.com.br/filepost.asp">
<div id="tudo">
<div id="um">
<label><strong>Nome:</strong>
<input type="text" name="camponome" id="camponome">
</label>
<br />
<label><strong>E-mail:</strong>
<input type="text" name="campoemail" id="campoemail" >
</label>
<br />
<label><strong>Anexos:</strong>
<input type="file" name="anexo" id="campoanexo" ><br />
<% for each x in request.form
response.write( x & ": " & request.form( x ) & "<br>" )
next
%>
</label>
</div>
<div id="dois">
<input type="submit" value="" id="submit" />
</div>
<div id="tres">
<label><strong>Mensagem:</strong><br />
<textarea name="campomensagem" id="mensagem" cols="45" rows="7"></textarea>
</label>
</div>
<div class="clear"></div>
</div>
</form>
<div id="peesquerda"></div><div id="pe"></div>
</body>
</html>
O conteúdo do arquivo upload_funcoes.asp do include é:
<%
Server.ScriptTimeout = 50000
' Upload Sem componentes ---------------------------------------
Sub BuildUploadRequest(RequestBin)
on error resume next
Dim sCaminho
sCaminho = "e:\home\meudominio\web\anexos\"
PosBeg = 1
PosEnd = InStrB(PosBeg, RequestBin, getByteString(Chr(13)))
boundary = MidB(RequestBin, PosBeg, PosEnd - PosBeg)
BoundaryPos = InStrB(1, RequestBin, boundary)
Do Until (BoundaryPos = InStrB(RequestBin, boundary & getByteString("--")))
Dim UploadControl
Set UploadControl = CreateObject("Scripting.Dictionary")
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)
If PosFile <> 0 And (PosFile < PosBound) Then
PosBeg = PosFile + 10
PosEnd = InStrB(PosBeg, RequestBin, getByteString(Chr(34)))
FileName = getString(MidB(RequestBin, PosBeg, PosEnd - PosBeg))
UploadControl.Add "FileName", FileName
Pos = InStrB(PosEnd, RequestBin, getByteString("Content-Type:"))
PosBeg = Pos + 14
PosEnd = InStrB(PosBeg, RequestBin, getByteString(Chr(13)))
ContentType = getString(MidB(RequestBin, PosBeg, PosEnd - PosBeg))
UploadControl.Add "ContentType", ContentType
PosBeg = PosEnd + 4
PosEnd = InStrB(PosBeg, RequestBin, boundary) - 2
Value = MidB(RequestBin, PosBeg, PosEnd - PosBeg)
Else
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
UploadControl.Add "Value", Value
UploadRequest.Add Name, UploadControl
BoundaryPos = InStrB(BoundaryPos + LenB(boundary), RequestBin, boundary)
Loop
End Sub
Function getByteString(StringStr)
For i = 1 To Len(StringStr)
Char = Mid(StringStr, i, 1)
getByteString = getByteString & ChrB(AscB(Char))
Next
End Function
Function getString(StringBin)
getString = ""
For intCount = 1 To LenB(StringBin)
getString = getString & Chr(AscB(MidB(StringBin, intCount, 1)))
Next
End Function
' Fim upload sem Componentes -----------------------------------------
%>
O conteúdo do arquivo filepost.asp que é para onde o formulário é direcionado após o submit é:
<!--#include file="upload.asp"-->
<%
dim x
set x = New cla_Upload
x.processaupload()
x.salvararquivos()
set x=nothing
response.redirect("http://www.meudominio.com.br/sucesso.html")
%>
E por último o conteúdo do arquivo upload.asp do include é:
<%
Class cla_Upload
Dim myRequest
Dim myRequestFiles
Dim tmpRequestFiles
dim crlf
Dim bJaProcessou
Public property get Variaveis(sVariavel)
on error resume next
if bJaProcessou then
Variaveis=myRequest(sVariavel)
end if
end property
Public Sub ProcessaUpload()
if bJaProcessou then
'erro
exit sub
end if
'Altera o tempo de processamento para arquivos grandes
Server.ScriptTimeout = 5400
Const ForWriting = 2
Const TristateTrue = -1
'Recupera os dados postados na forma binária
PostData = ""
Dim biData
biData = Request.BinaryRead(Request.TotalBytes)
'Transforma os dados da forma binária para algo mais legível
For nIndex = 1 to LenB(biData)
PostData = PostData & Chr(AscB(MidB(biData,nIndex,1)))
Next
'Recupera o content type para determinar o encoding dos dados
ContentType = Request.ServerVariables( _
"HTTP_CONTENT_TYPE")
ctArray = Split(ContentType, ";")
'Se o encoding for
'"multipart/form-data", então foi feito upload, damos sequencia ao processamento
If Trim(ctArray(0)) = "multipart/form-data" Then
ErrMsg = ""
' Obtem o boundery, o separador de variáveis utilizado na transmissão
bArray = Split(Trim(ctArray(1)), "=")
Boundary = Trim(bArray(1))
'Usa o Boundary para separar todas as variáveis
FormData = Split(PostData, Boundary)
'Criação de 3 scripting.dictionary que guardarão as informações
Set myRequest = CreateObject("Scripting.Dictionary")
Set myRequestFiles = CreateObject("Scripting.Dictionary")
FileCount = 1
For x = 0 to UBound(FormData)
set tmpRequestFiles=CreateObject("Scripting.Dictionary")
'Faz a localização de dois caracteres crlf que
'Marcam o fim dos metadados do campo e inicio dos dados propriamente
InfoEnd = InStr(FormData(x), CrLf & CrLf)
If InfoEnd > 0 Then
'Pega as informações sobre o campo
varInfo = Mid(FormData(x), 3, InfoEnd - 3)
'Pega o valor do campo, evitando os 2 crlf no inicio
'e o crlf que encontra-se no final
varValue = Mid(FormData(x), InfoEnd + 4, _
Len(FormData(x)) - InfoEnd - 7)
'Verifica se trata-se de um arquivo ou de uma variável qualquer
If (InStr(varInfo, "filename=") > 0) Then
'Monta um script dictionary com as informações sobre o arquivo
tmpRequestFiles.add "nome",GetFieldName(varInfo)
tmpRequestFiles.add "conteudo",varValue
tmpRequestFiles.add "filename",GetFileName(varInfo)
tmpRequestFiles.add "filetype",GetFileType(varInfo)
'Insere o script dictionary montado dentro de outro, contendo
'Todos os arquivos que levaram upload
myRequestFiles.ADD "arq" & FileCount,tmpRequestFiles
FileCount = FileCount + 1
Else
'É um campo comum
myRequest.add GetFieldName(varInfo), varValue
End If
End If
Next
Else
ErrMsg = "Falha no Encoding Type!"
End If
bjaprocessou=true
End Sub
Sub class_Initialize
bJaprocessou=false
CrLf = Chr(13) & Chr(10)
end Sub
Public Sub SalvarArquivos()
dim icnt
icnt=1
do while icnt<=myRequestFiles.Count
set tmprequestfiles=myRequestFiles.Item("arq" & icnt)
Set lf = server.createObject("Scripting.FileSystemObject")
' para utilizar o nome do arquivo original é necessário
'determinar que tipo de client enviou o arquivo.
'clientes Macintosh enviam apenas o nome do arquivo
'sem path, enquanto clientes Windows
'enviam o caminho inteiro do arquivo selecionado
BrowserType = UCase(Request.ServerVariables( "HTTP_USER_AGENT"))
If (InStr(BrowserType, "WIN") > 0) Then
'Sendo Windows, obtem o nome do arquivo do final do path
sPos = InStrRev(tmprequestfiles("filename"), "\")
fName = Mid(tmprequestfiles("filename"), sPos + 1)
End If
If (InStr(BrowserType, "MAC") > 0) Then
'Neste caso apenas o nome do arquivo foi recebido
fName = tmprequestfiles("filename")
End If
'se fizer um upload para um caminho diferente, altere aqui
FilePath = "e:\home\meudominio\web\anexos\" & fName
SavePath = Server.MapPath(FilePath)
Set SaveFile = lf.CreateTextFile(SavePath, True)
SaveFile.Write(tmprequestfiles("conteudo"))
SaveFile.Close
icnt=icnt+1
loop
End Sub
'Esta função recupera o nome de um campo
Private Function GetFieldName(infoStr)
sPos = InStr(infoStr, "name=")
EndPos = InStr(sPos + 6, infoStr, Chr(34) & ";")
If EndPos = 0 Then
EndPos = inStr(sPos + 6, infoStr, Chr(34))
End If
GetFieldName = Mid(infoStr, sPos + 6, endPos - (sPos + 6))
End Function
'Esta função recupera o filename de um arquivo
Private Function GetFileName(infoStr)
sPos = InStr(infoStr, "filename=")
EndPos = InStr(infoStr, Chr(34) & CrLf)
GetFileName = Mid(infoStr, sPos + 10, EndPos - (sPos + 10))
End Function
'Esta função recupera o MIME type de um arquivo
Private Function GetFileType(infoStr)
sPos = InStr(infoStr, "Content-Type: ")
GetFileType = Mid(infoStr, sPos + 14)
End Function
End Class
%>
Eu estava esperando que o arquivo fosse enviado com o anexo, porém como já disse aparece o erro:
Pergunta
pedrosbc
Bom dia estou tentando utilizar um script em asp para o upload de arquivos para o servidor sem a utilização de componentes, porém estou recebendo o seguinte erro:
Microsoft VBScript runtime error '800a01a8'
Object required: 'myRequestFiles'
/upload.asp, line 191
O problema é que o arquivo não tem 191 linhas , tem 148 linhas, porém o problema se refere também a um objeto, o myRequestFiles, que está presente no código, porém o que acredito que está acontecendo é que ou o valor do myRequestFiles não está sendo passado corretamente, ou tem algum erro de programação. Bem copiei o código para o upload sem componentes daqui do forum...fiz um copy&paste e o problema persiste, gostaria, se possível alguém aqui me desse uma mão.
Bom o formulário parte de contato.asp:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <!-- #include file = "upload_funcoes.asp" --> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>Untitled Document</title> <link href="css/teste3.css" rel="stylesheet" type="text/css" /> <script language="JavaScript"> <!-- self.name = "contato"; //--> </script> </head> <body> <div id="cabecalhoesquerda"></div><div id="cabecalho"></div> <div id="clear"></div> <div id="esquerda"></div> <form method="post" enctype="multpart/formdata" name="form1" action="http://www.meudominio.com.br/filepost.asp"> <div id="tudo"> <div id="um"> <label><strong>Nome:</strong> <input type="text" name="camponome" id="camponome"> </label> <br /> <label><strong>E-mail:</strong> <input type="text" name="campoemail" id="campoemail" > </label> <br /> <label><strong>Anexos:</strong> <input type="file" name="anexo" id="campoanexo" ><br /> <% for each x in request.form response.write( x & ": " & request.form( x ) & "<br>" ) next %> </label> </div> <div id="dois"> <input type="submit" value="" id="submit" /> </div> <div id="tres"> <label><strong>Mensagem:</strong><br /> <textarea name="campomensagem" id="mensagem" cols="45" rows="7"></textarea> </label> </div> <div class="clear"></div> </div> </form> <div id="peesquerda"></div><div id="pe"></div> </body> </html> O conteúdo do arquivo upload_funcoes.asp do include é: <% Server.ScriptTimeout = 50000 ' Upload Sem componentes --------------------------------------- Sub BuildUploadRequest(RequestBin) on error resume next Dim sCaminho sCaminho = "e:\home\meudominio\web\anexos\" PosBeg = 1 PosEnd = InStrB(PosBeg, RequestBin, getByteString(Chr(13))) boundary = MidB(RequestBin, PosBeg, PosEnd - PosBeg) BoundaryPos = InStrB(1, RequestBin, boundary) Do Until (BoundaryPos = InStrB(RequestBin, boundary & getByteString("--"))) Dim UploadControl Set UploadControl = CreateObject("Scripting.Dictionary") 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) If PosFile <> 0 And (PosFile < PosBound) Then PosBeg = PosFile + 10 PosEnd = InStrB(PosBeg, RequestBin, getByteString(Chr(34))) FileName = getString(MidB(RequestBin, PosBeg, PosEnd - PosBeg)) UploadControl.Add "FileName", FileName Pos = InStrB(PosEnd, RequestBin, getByteString("Content-Type:")) PosBeg = Pos + 14 PosEnd = InStrB(PosBeg, RequestBin, getByteString(Chr(13))) ContentType = getString(MidB(RequestBin, PosBeg, PosEnd - PosBeg)) UploadControl.Add "ContentType", ContentType PosBeg = PosEnd + 4 PosEnd = InStrB(PosBeg, RequestBin, boundary) - 2 Value = MidB(RequestBin, PosBeg, PosEnd - PosBeg) Else 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 UploadControl.Add "Value", Value UploadRequest.Add Name, UploadControl BoundaryPos = InStrB(BoundaryPos + LenB(boundary), RequestBin, boundary) Loop End Sub Function getByteString(StringStr) For i = 1 To Len(StringStr) Char = Mid(StringStr, i, 1) getByteString = getByteString & ChrB(AscB(Char)) Next End Function Function getString(StringBin) getString = "" For intCount = 1 To LenB(StringBin) getString = getString & Chr(AscB(MidB(StringBin, intCount, 1))) Next End Function ' Fim upload sem Componentes ----------------------------------------- %> O conteúdo do arquivo filepost.asp que é para onde o formulário é direcionado após o submit é: <!--#include file="upload.asp"--> <% dim x set x = New cla_Upload x.processaupload() x.salvararquivos() set x=nothing response.redirect("http://www.meudominio.com.br/sucesso.html") %> E por último o conteúdo do arquivo upload.asp do include é: <% Class cla_Upload Dim myRequest Dim myRequestFiles Dim tmpRequestFiles dim crlf Dim bJaProcessou Public property get Variaveis(sVariavel) on error resume next if bJaProcessou then Variaveis=myRequest(sVariavel) end if end property Public Sub ProcessaUpload() if bJaProcessou then 'erro exit sub end if 'Altera o tempo de processamento para arquivos grandes Server.ScriptTimeout = 5400 Const ForWriting = 2 Const TristateTrue = -1 'Recupera os dados postados na forma binária PostData = "" Dim biData biData = Request.BinaryRead(Request.TotalBytes) 'Transforma os dados da forma binária para algo mais legível For nIndex = 1 to LenB(biData) PostData = PostData & Chr(AscB(MidB(biData,nIndex,1))) Next 'Recupera o content type para determinar o encoding dos dados ContentType = Request.ServerVariables( _ "HTTP_CONTENT_TYPE") ctArray = Split(ContentType, ";") 'Se o encoding for '"multipart/form-data", então foi feito upload, damos sequencia ao processamento If Trim(ctArray(0)) = "multipart/form-data" Then ErrMsg = "" ' Obtem o boundery, o separador de variáveis utilizado na transmissão bArray = Split(Trim(ctArray(1)), "=") Boundary = Trim(bArray(1)) 'Usa o Boundary para separar todas as variáveis FormData = Split(PostData, Boundary) 'Criação de 3 scripting.dictionary que guardarão as informações Set myRequest = CreateObject("Scripting.Dictionary") Set myRequestFiles = CreateObject("Scripting.Dictionary") FileCount = 1 For x = 0 to UBound(FormData) set tmpRequestFiles=CreateObject("Scripting.Dictionary") 'Faz a localização de dois caracteres crlf que 'Marcam o fim dos metadados do campo e inicio dos dados propriamente InfoEnd = InStr(FormData(x), CrLf & CrLf) If InfoEnd > 0 Then 'Pega as informações sobre o campo varInfo = Mid(FormData(x), 3, InfoEnd - 3) 'Pega o valor do campo, evitando os 2 crlf no inicio 'e o crlf que encontra-se no final varValue = Mid(FormData(x), InfoEnd + 4, _ Len(FormData(x)) - InfoEnd - 7) 'Verifica se trata-se de um arquivo ou de uma variável qualquer If (InStr(varInfo, "filename=") > 0) Then 'Monta um script dictionary com as informações sobre o arquivo tmpRequestFiles.add "nome",GetFieldName(varInfo) tmpRequestFiles.add "conteudo",varValue tmpRequestFiles.add "filename",GetFileName(varInfo) tmpRequestFiles.add "filetype",GetFileType(varInfo) 'Insere o script dictionary montado dentro de outro, contendo 'Todos os arquivos que levaram upload myRequestFiles.ADD "arq" & FileCount,tmpRequestFiles FileCount = FileCount + 1 Else 'É um campo comum myRequest.add GetFieldName(varInfo), varValue End If End If Next Else ErrMsg = "Falha no Encoding Type!" End If bjaprocessou=true End Sub Sub class_Initialize bJaprocessou=false CrLf = Chr(13) & Chr(10) end Sub Public Sub SalvarArquivos() dim icnt icnt=1 do while icnt<=myRequestFiles.Count set tmprequestfiles=myRequestFiles.Item("arq" & icnt) Set lf = server.createObject("Scripting.FileSystemObject") ' para utilizar o nome do arquivo original é necessário 'determinar que tipo de client enviou o arquivo. 'clientes Macintosh enviam apenas o nome do arquivo 'sem path, enquanto clientes Windows 'enviam o caminho inteiro do arquivo selecionado BrowserType = UCase(Request.ServerVariables( "HTTP_USER_AGENT")) If (InStr(BrowserType, "WIN") > 0) Then 'Sendo Windows, obtem o nome do arquivo do final do path sPos = InStrRev(tmprequestfiles("filename"), "\") fName = Mid(tmprequestfiles("filename"), sPos + 1) End If If (InStr(BrowserType, "MAC") > 0) Then 'Neste caso apenas o nome do arquivo foi recebido fName = tmprequestfiles("filename") End If 'se fizer um upload para um caminho diferente, altere aqui FilePath = "e:\home\meudominio\web\anexos\" & fName SavePath = Server.MapPath(FilePath) Set SaveFile = lf.CreateTextFile(SavePath, True) SaveFile.Write(tmprequestfiles("conteudo")) SaveFile.Close icnt=icnt+1 loop End Sub 'Esta função recupera o nome de um campo Private Function GetFieldName(infoStr) sPos = InStr(infoStr, "name=") EndPos = InStr(sPos + 6, infoStr, Chr(34) & ";") If EndPos = 0 Then EndPos = inStr(sPos + 6, infoStr, Chr(34)) End If GetFieldName = Mid(infoStr, sPos + 6, endPos - (sPos + 6)) End Function 'Esta função recupera o filename de um arquivo Private Function GetFileName(infoStr) sPos = InStr(infoStr, "filename=") EndPos = InStr(infoStr, Chr(34) & CrLf) GetFileName = Mid(infoStr, sPos + 10, EndPos - (sPos + 10)) End Function 'Esta função recupera o MIME type de um arquivo Private Function GetFileType(infoStr) sPos = InStr(infoStr, "Content-Type: ") GetFileType = Mid(infoStr, sPos + 14) End Function End Class %>Eu estava esperando que o arquivo fosse enviado com o anexo, porém como já disse aparece o erro:
Microsoft VBScript runtime error '800a01a8'
Object required: 'myRequestFiles'
/upload.asp, line 191
Será que alguém pode me ajudar?
Desde já agradeço
Link para o comentário
Compartilhar em outros sites
3 respostass a esta questão
Posts Recomendados
Participe da discussão
Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.