[VB6/PHP] Automatisch uploaden van een bestand

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • iznogood
  • Registratie: September 2001
  • Niet online
Mijn bedoeling is om via VB6 automatisch een bestand te uploaden naar de webserver (zonder eerst een submit knop te hoeven gebruiken).

In het VB6 programma zit een webbrowser control waarmee ik dat wil gaan doen.
De webserver ondersteund PHP, MySQL.

Nu is mijn vraag hoe ik dit als beste aan kan passen. Ik wil het gebruik van javascript vermijden om een uploadform automatisch te laten verzenden.

Loop ik dan niet tegen security issues aan? Hoe kan ik dit het beste bewerkstelligen?

Just as Good


Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

Waarom uploaden via het HTTP protocol? Ik neem aan dat je FTP access hebt...waarom gebruik je dat niet?

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

  • iznogood
  • Registratie: September 2001
  • Niet online
-NMe- schreef op dinsdag 26 april 2005 @ 18:38:
Waarom uploaden via het HTTP protocol? Ik neem aan dat je FTP access hebt...waarom gebruik je dat niet?
Er is geen FTP access... De server komt op winxp te draaien en een extra ftp programma gaat het te complex maken voor de gebruiker..

Just as Good


Acties:
  • 0 Henk 'm!

  • gorgi_19
  • Registratie: Mei 2002
  • Laatst online: 18:44

gorgi_19

Kruimeltjes zijn weer op :9

En een connectie maken via een webservice? Geen idee of er een goede ondersteuning is voor webservices vanuit VB6, maar dit lijkt me wel :)

Digitaal onderwijsmateriaal, leermateriaal voor hbo


Acties:
  • 0 Henk 'm!

  • iznogood
  • Registratie: September 2001
  • Niet online
gorgi_19 schreef op dinsdag 26 april 2005 @ 18:45:
En een connectie maken via een webservice? Geen idee of er een goede ondersteuning is voor webservices vanuit VB6, maar dit lijkt me wel :)
De control die ik wil gebruiken is de Webbrowser control ( dit is in principe hetzelfde als IE )

In principe moet het er als volgt uitzien :

Serverside:
PHP Upload script

Clientside:
HTML Form (oid) dat een bestand verstuurd.

In eerste instantie wilde ik het bestand met een query in de server dumpen ( is een textbestand ) maar dan ben ik volgens mij gebonden aan 255 karakters ?? Dit doe ik liever dan fysiek een bestand uploaden.

[ Voor 13% gewijzigd door iznogood op 26-04-2005 18:51 ]

Just as Good


Acties:
  • 0 Henk 'm!

  • T-MOB
  • Registratie: Maart 2001
  • Laatst online: 16:36
iznogood schreef op dinsdag 26 april 2005 @ 18:50:
In eerste instantie wilde ik het bestand met een query in de server dumpen ( is een textbestand ) maar dan ben ik volgens mij gebonden aan 255 karakters ?? Dit doe ik liever dan fysiek een bestand uploaden.
Dat ligt aan de database die je gebruikt. In MySQL kun je prima een text-veld aanmaken waar lange lappen text in kunnen hoor. Zolang het bestand niet al te groot is zul je niet snel tegen limieten aanlopen...

Regeren is vooruitschuiven


Acties:
  • 0 Henk 'm!

  • PolarBear
  • Registratie: Februari 2001
  • Niet online
iznogood schreef op dinsdag 26 april 2005 @ 18:50:
[...]

De control die ik wil gebruiken is de Webbrowser control ( dit is in principe hetzelfde als IE )

In principe moet het er als volgt uitzien :

Serverside:
PHP Upload script

Clientside:
HTML Form (oid) dat een bestand verstuurd.

In eerste instantie wilde ik het bestand met een query in de server dumpen ( is een textbestand ) maar dan ben ik volgens mij gebonden aan 255 karakters ?? Dit doe ik liever dan fysiek een bestand uploaden.
- Wellicht posten van het bestand in een HTML formulier?
- Wellicht de webbrowser functionaliteit gebruiken?
- Uploaden van het bestand via een HTML fomulier?
- Met WinSock werken?
- Met VB.Net werken (gemakkelijker werken met sockets etc)....

Acties:
  • 0 Henk 'm!

  • iznogood
  • Registratie: September 2001
  • Niet online
T-MOB schreef op dinsdag 26 april 2005 @ 19:16:
[...]


Dat ligt aan de database die je gebruikt. In MySQL kun je prima een text-veld aanmaken waar lange lappen text in kunnen hoor. Zolang het bestand niet al te groot is zul je niet snel tegen limieten aanlopen...
Ik voer de query uit in Visual basic met ODBC om em zo in mijn database te krijgen. Dus volgens jou kan ik dat zonder problemen doen? Ik ben namelijk niet bang voor de limieten van MySQL, maar van VB in combinatie met ODBC.
- Wellicht posten van het bestand in een HTML formulier?
Dacht k ook aan. Voordeel: Simpel Nadeel: heb het bestand niet in de mysql database
- Wellicht de webbrowser functionaliteit gebruiken?
Welke functionaliteiten doel je op ?
- Uploaden van het bestand via een HTML fomulier?
Zie eerste punt.
- Met WinSock werken?
Kan, is alleen lang geleden dat ik met winsock gewerkt heb. Kost voor mij relatief veel tijd om deze oplossing te maken.
- Met VB.Net werken (gemakkelijker werken met sockets etc)....
VB.Net wil ik naar overgaan... alleen nog niet met mijn huidige project.

[ Voor 40% gewijzigd door iznogood op 26-04-2005 19:34 ]

Just as Good


Acties:
  • 0 Henk 'm!

  • T-MOB
  • Registratie: Maart 2001
  • Laatst online: 16:36
Ik zie niet waarom ODBC dwars zou liggen, in 10 minuten Googlen ook niets gevonden. Maar probeer gewoon eens een string van 1000 karakters met VB in je database te zetten. Als dat niet lukt kan er altijd nog een andere manier bedacht worden...

Regeren is vooruitschuiven


Acties:
  • 0 Henk 'm!

  • iznogood
  • Registratie: September 2001
  • Niet online
T-MOB schreef op dinsdag 26 april 2005 @ 19:40:
Ik zie niet waarom ODBC dwars zou liggen, in 10 minuten Googlen ook niets gevonden. Maar probeer gewoon eens een string van 1000 karakters met VB in je database te zetten. Als dat niet lukt kan er altijd nog een andere manier bedacht worden...
Ik krijg er bijna 1000 karakters ingepompt. Daarna zit ik op de maximale lengte van een regel van vb. Ook met het maken van een string van meer dan 1000 karakters gaat ODBC over zijn nek :s
Waarschijnlijk dat de queries toch een maximale lengte hebben... is balen.. was wel de meest ideale oplossing geweest.

[ Voor 11% gewijzigd door iznogood op 26-04-2005 20:32 ]

Just as Good


Acties:
  • 0 Henk 'm!

  • T-MOB
  • Registratie: Maart 2001
  • Laatst online: 16:36
Dan blijven de al genoemde mogelijkheden over lijkt me zo. Het netste lijkt me dan inderdaad om op de server een PHP script te zetten dat een upload afhandelt (je kunt in PHP prima textfiles inlezen en die opslaan in de database). Wat overblijft is hoe het bestand er komt.

Volgens mij is het (iig voor jou) het makkelijkst om gewoon een HTML pagina te maken met een uploadformulier. De gebruiker zal hier echter altijd actief mee aan de slag moeten. Het automagisch vullen van een <input type="file"> kan om security-redenen in geen enkele browser die ik ken.

Als het wél automatisch moet gebeuren is het volgens mij het mooiste om in VB met sockets aan de slag te gaan. Hier staat een tutorial hoe je een HTTP request kunt doen mbv VB6. Hoef je alleen nog uit te zoeken welke HTTP commando's je moet sturen om een file te posten...

[ Voor 3% gewijzigd door T-MOB op 26-04-2005 21:03 ]

Regeren is vooruitschuiven


Acties:
  • 0 Henk 'm!

  • iznogood
  • Registratie: September 2001
  • Niet online
T-MOB schreef op dinsdag 26 april 2005 @ 21:02:
Dan blijven de al genoemde mogelijkheden over lijkt me zo. Het netste lijkt me dan inderdaad om op de server een PHP script te zetten dat een upload afhandelt (je kunt in PHP prima textfiles inlezen en die opslaan in de database). Wat overblijft is hoe het bestand er komt.

Volgens mij is het (iig voor jou) het makkelijkst om gewoon een HTML pagina te maken met een uploadformulier. De gebruiker zal hier echter altijd actief mee aan de slag moeten. Het automagisch vullen van een <input type="file"> kan om security-redenen in geen enkele browser die ik ken.

Als het wél automatisch moet gebeuren is het volgens mij het mooiste om in VB met sockets aan de slag te gaan. Hier staat een tutorial hoe je een HTTP request kunt doen mbv VB6. Hoef je alleen nog uit te zoeken welke HTTP commando's je moet sturen om een file te posten...
En als ik toch javascript ga gebruiken om het form automatisch te verzenden... zou theoretisch toch zonder problemen moeten lukken of krijg je dan ook weer die security issues? Als dat het geval is ben ik inderdaad gewoon aangewezen op winsock :s


Ik vind net hier :
http://dev.mysql.com/tech...les/vb-blob-handling.html

Nog een andere oplossing, maar ik weet niet of ik die kan gebruiken? Een blob is in principe toch hetzelfde als een groot textveld?

[ Voor 10% gewijzigd door iznogood op 26-04-2005 21:24 ]

Just as Good


Acties:
  • 0 Henk 'm!

  • MBV
  • Registratie: Februari 2002
  • Laatst online: 20-09 22:44

MBV

Wat ik gebruikte voor transport van VB naar PHP was een XMLRPC object. Moet je maar eens op zoeken: is een onwijs licht protocol om data over het net te sturen. Uiteraard kan je ook met SOAP werken, met nieuwere versies van PHP moet dat net zo goed werken.
PHP linkje XMLRPC: http://nl3.php.net/xmlrpc
PHP linkje SOAP:
'k heb alleen geen voorbeeldcode voor je, aangezien mijn vorige stageplaats een paar wachtwoorden heeft veranderd :)

Acties:
  • 0 Henk 'm!

  • T-MOB
  • Registratie: Maart 2001
  • Laatst online: 16:36
iznogood schreef op dinsdag 26 april 2005 @ 21:22:
[...]
En als ik toch javascript ga gebruiken om het form automatisch te verzenden... zou theoretisch toch zonder problemen moeten lukken of krijg je dan ook weer die security issues? Als dat het geval is ben ik inderdaad gewoon aangewezen op winsock :s
Het verzenden van het form zal het punt niet zijn. Het punt is dat je de input niet automatisch gevuld krijgt. Vrij logisch omdat het anders wel erg makkelijk zou worden om data die op een standaard plek staat op client computers stiekum te bemachtigen...
Ik vind net hier :
http://dev.mysql.com/tech...les/vb-blob-handling.html

Nog een andere oplossing, maar ik weet niet of ik die kan gebruiken? Een blob is in principe toch hetzelfde als een groot textveld?
Een BLOB is bij mijn beste weten een binair veld. Daar valt vast wel wat tegenaan te hacken om het werkend te krijgen, maar waarom zou je? In de link die ik je gaf staat letterlijk de code hoe je een socket opent naar een webserver. Het enige wat je daaraan hoeft te doen is uitzoeken wat je daar overheen moet pompen. Met een simpel PHP scriptje kun je zien hoe een browser tegen je server praat als het gaat om file-uploads (werkt alleen als PHP als Apache module draait):
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<html>
<form enctype="multipart/form-data" method="post" action="">
  <p>
   <input type="hidden" name="MAX_FILE_SIZE" value="5000000" />
   <input type="file" name="file" id="file" />
   <input type="submit" name="submit" value="upload" />
  </p>
 </form>
<?php

//show headers (only works when PHP is running as an Apache module)
if (isset($_POST['submit']))
{
    $headers = apache_request_headers();
    foreach ($headers as $header => $value) 
    {
        echo $header .': ' .$value ."<br />\n";
    }
}
?>
</html>

Hoe je de data moet versturen staat verder in RFC 1867. Alhoewel het aan te raden is de hele RFC door te nemen is met name het eerste voorbeeld in hoofdstuk 6 voor jou relevant.

@hierboven, er staat weinig documentatie over xmlrpc op PHP.net, dus ik kan het compleet mis hebben. Maar XML gebruiken lost het probleem van de data-overdracht toch niet op. Voor zover ik het begrepen heb heeft TS alleen een webserver waar tegen gepraat kan worden. Er zal dan hoe dan ook een socket geopend moeten worden, toch? of werkt het anders?

Regeren is vooruitschuiven


Acties:
  • 0 Henk 'm!

  • iznogood
  • Registratie: September 2001
  • Niet online
Idd erg nuttige info. Ontdanks dat heb ik toch proberen die "blob" code aan te passen. Dan hoeft ik niet een html/php script te schrijven, maar ik kan gewoon in VB blijven werken.

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
        Dim mystream As ADODB.Stream
        Set mystream = New ADODB.Stream
        mystream.Type = adTypeBinary

        conn.ConnectionString = "Provider=MSDASQL; Driver={MySQL ODBC 3.51 Driver}; Server=127.0.0.1; Database=align; UID=; PWD=; OPTION=" & 1 + 2 + 8 + 32 + 2048 + 16384
        conn.Open
      
        rs.Open "SELECT * FROM opdrachten WHERE gebruikersnaam='" & ModDB.IngelogdeGebruiker & "' AND opdrnr='" & Str(Val(ModDB.Hoofdstuk) - 1) & "'", conn, adOpenStatic, adLockOptimistic
        mystream.Open
        mystream.LoadFromFile App.path & "\" & Str(Val(ModDB.Hoofdstuk) - 1) & ".htm"

        rs!pagina = mystream.Read
        rs.Update
        mystream.Close
        rs.Close
        conn.Close


Dit werkt redelijk. Het probleem is nu echter dat ik een foutmelding krijg waarvan ik niet snap hoe deze ontstaat :

"Query-based update failed because the row to update could not be found"

Nu denk ik dat het probleem niet zit in :
code:
1
SELECT * FROM opdrachten WHERE gebruikersnaam='" & ModDB.IngelogdeGebruiker & "' AND opdrnr='" & Str(Val(ModDB.Hoofdstuk) - 1) & "'", conn, adOpenStatic, adLockOptimistic


Maar in dat stream gebeuren. Aangezien ik hier niet zo bekend mee ben kom ik er niet goed uit.

[ Voor 9% gewijzigd door iznogood op 27-04-2005 09:16 ]

Just as Good


Acties:
  • 0 Henk 'm!

Verwijderd

Zit er wel een veld in je tabel wat een record uniek maakt (primary key)? Mag ik verder uit je code begrijpen dat je per ingelogde gebruiker maar 1 opdracht toestaat? Anders is je code erg onlogisch, aangezien je klakkeloos (en zonder te checken of er een record is) het eerste record vult met je stream.

Acties:
  • 0 Henk 'm!

  • sopsop
  • Registratie: Januari 2002
  • Laatst online: 18-09 13:37

sopsop

[v] [;,,;] [v]

Hier een voorbeeldje in vbs: http://www.motobit.com/tips/detpg_uploadvbsie/

Dat moet vrij probleemloos in VB6 om te zetten zijn.

Acties:
  • 0 Henk 'm!

  • iznogood
  • Registratie: September 2001
  • Niet online
Is inmiddels al opgelost... er zijn meerdere opdrachten beschikbaar, maar dat wordt al eerder gechecked :)

thanks allemaal!

Just as Good

Pagina: 1