Newsgroup: it.comp.lang.visual-basic
Titolo: XMLHTTP tronca i dati trasmessi?

Ciao NG!
Ho un piccolo grande problema: dovrei usare l'oggetto XMLHTTP di 
Microsoft per trasferire dati a un sito internet.
Per creare l'oggetto faccio una cosa del tipo:
On Error Resume Next
Err.Clear
Set myRequest = CreateObject("Microsoft.XMLHTTP")
If Err.Number <> 0& Then
    Err.Clear
    Set myRequest = CreateObject("Msxml2.XMLHTTP")
    If Err.Number <> 0& Then
       Err.Clear
       Set myRequest = Nothing
    End If
End If
In questo modo il programma che sto scrivendo non è troppo restrittivo 
con i componenti che devono essere installati sul PC.
Quando invio dei file mi succede una cosa strana. Riporto un breve e 
semplificato pezzo del codice:
myRequest.Open "post", Url, OperazioneAsincrona
myRequest.setRequestHeader "Content-Type" , _
   "multipart/form-data; boundary=""DELIMITATORE"""
myRequest.setRequestHeader "Content-Length", _
   Len(Dati)
myRequest.Send Dati
Dove Dati è una variabile stringa che contiene i dati da inviare al 
server. Per esempio:
--DELIMITATORE
Content-Disposition: form-data; name="variabile"
Valore della variabile
--DELIMITATORE
Content-Disposition: form-data; name="campo_file; filename="C:\Immagine.jpg"
Content-Type: image/jpeg
<Qui viene inserito il contenuto binario del file>
--DELIMITATORE--
Orbene, il buon Fiddler (programmino che mostra i dati in transito 
da/per un sito internet per esempio) mi dice che tali Dati vengono 
troncati al primo byte con valore 0 (0x00 in esadecimale) del contenuto 
del file C:\Immagine.jpg (e quindi il server che riceve le info non 
apprezza...)
Parrebbe che l'oggetto XMLHTTP, vedendo il carattere nullo, ritenga che 
stia a significare la fine della stringa, ovvero dei dati da inviare.
Ho pensato che il post con Content-Type=multipart/form-data non 
accettasse campi contenenti il byte 0, ma così non è (Fiddler mi dice 
che i dati inviati da Internet Explorer con un <form method="post" 
enctype="multipart/form-data"> e un campo <input type="file"> contengono 
il byte incriminato).
...Che fare?
Grazie!


In effetti pare proprio che se contiene un bel Chr$(0&) (carattere 0x00) 
il corpo del messaggio viene troncato: facendo
myRequest.Send Replace$(Dati, Chr$(0&), Chr$(1&))
Vengono inviati tutti i dati (anche se non è corretto! Un file jpg per 
esempio può contenere Chr$(0&), ergo il Replace$ di cui sopra non è 
ovviamente utilizzabile, ma fa capire il problema.
Rimane solo da trovare la soluzione...
Non è che magari per caso qualcuno ha un'idea su come risolvere il problema?
Grazie
    Michele

 problema?
Ciao,
ti segnalo un paio di link:
http://builder.com.com/5100-31-5078105.html
http://support.microsoft.com/default.aspx?scid=kb;EN-US;q296772
Ciao
-- 
Gianluca Cannalire
Microsoft MVP/MCP - Visual Basic
http://www.visual-basic.it
http://community.visual-basic.it/gianluca
 

 Ciao
Grazie mille, Gianluca!
Non so perchè, ma facendo un giro che per me è inutile funziona:
' Così non funziona (dati troncati al primo byte 0):
myRequest.Send Dati
' Così funziona:
fd = FreeFile
Open "C:\dati" For Binary Access Write Lock Write As #fd
Put #fd, , Dati
Close #fd
Set oStream = CreateObject("ADODB.Stream")
oStream.Type = 1& 'adTypeBinary
oStream.Open
oStream.LoadFromFile "C:\Dati"
myRequest.Send oStream.Read
oStream.Close
Set oStream = Nothing
La differenza mi sfugge... Non sarebbe proprio possibile passare al 
metodo Send direttamente la variabile stringa?

 metodo Send direttamente la variabile stringa?
Forse il problema č proprio nella variabile stringa. Prova ad usare una
array di byte (ma nota che non sono certo del risultato).
Saluti, Claudio G.

 array di byte (ma nota che non sono certo del risultato).
Nada, avevo già provato:
- array di byte: non gli piace proprio
- variabile di tipo variant e variabile di tipo stringa: tronca i dati 
trasmessi al primo carattere nullo.
Grazie comunque!
Ciao
    Michele


Ah, e neppure StrConv(Dati, vbFromUnicode) è piaciuto.

 metodo Send direttamente la variabile stringa?
No, guarda la documentazione
http://msdn.microsoft.com/library/en-us/xmlsdk/html/b0d7d002-5e8e-4bc8-be0d-b9adf50fc271.asp?frame=true
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/ado270/htm/mdmthread.asp
Ciao!


 
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/ado270/htm/mdmthread.asp
 
Ti ringrazio per l'interessamento, Gianluca (decisamente l'"MVP" accanto 
al tuo nome è decisamente appropriato).
Tuttavia dalla documentazione non capisco dove sia il limite... Dal 
primo link si evince come il parametro per send possa essere un 
variant/BSTR, e il VB usa le stringhe in BSTR. Inoltre la lunghezza di 
una String non è data dalla posizione per primo char 0, ma da appositi 4 
byte che precedono la stringa in memoria, per cui una String in VB può 
contenere anche char(0).
Concludendo: rimagono i miei dubbi, e gli utenti che scaricheranno il 
setup del mio programmino avranno sul gobbo 6 MB aggiuntivi (MDAC, che 
non è presente su Windows 98) solo per permettere all'applicativo di 
fare il giro String -> File -> ADO Stream

 ha scritto nel messaggio
news:44c785a2$0$30251$4faf...@reader1.news.tin.it...

Urka! Fai prima a creare un socket e collegarti direttamente! (salvo che
F-Prot
non ti rilevi come virus :-)
Saluti, Claudio G.

 fare il giro String -> File -> ADO Stream
Ciao Michele,
scusa, non avevo visto questa tua risposta (!!!)
Puoi provare questo codice?:
Dim aBinaryData() as Byte
aBinaryData = StrConv(Dati, vbFromUnicode)
...
...
...
myRequest.Send Dati
Ciao
