L'oggetto TextStream di FSO può in realtà essere utilizzato per leggere e scrivere file binari.
In Visual Basic e VBScript, infatti, le strighe possono contenere qualsiasi carattere, anche il NULL-char, che non assume nessun significato speciale, in quanto le stringhe in VBS/VB non sono NULL terminated come in C, ma hanno un campo che ne memorizza la lunghezza.
Detto ciò, basta leggere un file binario come un normalissimo file ASCII, con la funzione Read(size) dell'oggetto TextStream: questa restituisce una stringa che contiene i dati del file binario senza che essi siano stati cambiati di una virgola.
Tutto sta adesso nel convertire tale BynaryString che abbiamo letto in un array di bytes, o viceversa, un array di bytes che vogliamo scrivere in una BinaryString.
Ci sono vari modi per effettuare queste conversioni, ecco un paio di esempi:
<%
Function StringToBinary(String)
Dim I, B
For I=1 to len(String)
B = B & ChrB(Asc(Mid(String,I,1)))
Next
StringToBinary = B
End Function
Function MBBinaryToString(Binary)
dim c1, c2, c3, p1, p2, p3
Dim L
c1 = 1 : c2 = 1 : c3 = 1
L = LenB(Binary)
Do While c1<=L
p3 = p3 & Chr(AscB(MidB(Binary,c1,1)))
c1 = c1 + 1 : c3 = c3 + 1
if c3>300 then
p2 = p2 & p3
p3 = ""
c3 = 1
c2 = c2 + 1
if c2>200 then
p1 = p1 & p2
p2 = ""
c2 = 1
End If
End If
Loop
MBBinaryToString = p1 & p2 & p3
End Function
%>Di seguito un semplice esempio, l'upload di un file qualsiasi al client.
L'esempio è stato tratto dallo script "download.asp", disponibile come allegato
<%
server.ScriptTimeout = 16200
response.buffer = true
response.contentType = "application/octet-stream"
set fs = Server.CreateObject ("Scripting.FileSystemObject")
set binfile = fs.OpenTextFile(server.mappath(".\mybinfile.exe))
fileSize = binfile.size
for i = 1 to fileSize
if not Response.IsClientConnected then
binfile.close
set binfile a = Nothing
response.clear
response.end
end if
response.binarywrite StringToBinary(binfile.read(1024*16))
response.flush
next
binfile.close
set binfile = Nothing
%>Su questa lista in passato è già apparso uno script simile, che utilizza un oggetto non documentato di ADO, Stream, per leggere file binari.
Questo oggetto legge qualsiasi tipo di file, ma è efficace esclusivamente per file molto piccoli: inatti esso carica in memoria tutto il contenuto dei file, quando si usa l'istruzione Load.
Il file rimane quindi in memoria fino a quando non lo si chiude e questo con file molto grandi può mandare in crisi il sistema.
L'oggetto TextStream, invece, non legge tutto il file quando lo si apre e pone in memoria esattamente la quantità di bytes che gli si dice di leggere di volta in volta e rappresenta dunque una valida alternativa all'utilizzo di ADODB.Stream.
Nota: Questo script contiene un allegato.
Esprimi il tuo giudizio su questo script:
Per procedere devi essere autenticato.








Stampa
Download



lo script ha degli errori
Continua »»» | Rispondi »»»