|
|
|

|

|
Dicas
|

|
ASP - Active Server Page (Miscelâneas)
|
|
 |
Título da Dica: Upload sem componentes
|
 |
|
|
Postada em 1/10/2003 por ~Ð@®£@Ñ
O upload de arquivos é na verdade uma mudança na forma de codificação dos dados que são transferidos do client para o servidor.
O formulário que estará transferindo o arquivo recebe a especificação de um tipo de codificação diferente e é necessário que no servidor esse tipo de codificação seja traduzido de volta ao formato de arquivo.
Normalmente isso é feito por componente, mas não quer dizer que não possa ser feito diretamente em código ASP. Veja o exemplo desta sub :
<% 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 PosFile<>0 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 %>
Essas subs foram criadas para manipular o objeto request obtendo dele o arquivo que sofreu upload e inserindo este arquivo dentro de um objeto scripting.dictionary.
Veja como utilizar essa sub :
O parâmetro que ela recebe é a leitura binária do objeto request, assim sendo começamos da seguinte forma :
RequestBin = Request.BinaryRead(byteCount)
Em seguinda criamos um objeto scripting.dictionary que será usado pela sub :
Dim UploadRequest Set UploadRequest = CreateObject("Scripting.Dictionary")
Chamamos a sub :
BuildUploadRequest(RequestBin)
Obtem-se então os dados do scripting.dictionary e utiliza-se o filesystemobject para gravar o arquivo :
contentType = UploadRequest.Item("blob").Item("ContentType") filepathname = UploadRequest.Item("blob").Item("FileName") filename = Right(filepathname,Len(filepathname)-InstrRev(filepathname,"\")) value = UploadRequest.Item("blob").Item("Value") caminho= server.MapPath(".")
caminho=caminho &"\upload\" 'Create FileSytemObject Component Set ScriptObject = Server.CreateObject("Scripting.FileSystemObject")
'Create and Write to a File pathEnd = Len(Server.mappath(Request.ServerVariables("PATH_INFO")))-14
on error resume next Set MyFile = ScriptObject.CreateTextFile(caminho & UploadRequest.Item("TXTarquivo").Item("Value") & filename)
For i = 1 to LenB(value) MyFile.Write chr(AscB(MidB(value,i,1))) Next
MyFile.Close %>
|
|
|
|

|