Avatar billede larsvn Nybegynder
08. maj 2003 - 21:10 Der er 16 kommentarer og
1 løsning

Eksempel til automatisk upload af fil søges

Dette er muligvis lidt Off Topic, men det involverer PHP så here goes. Ellers modtages forslag til hvilken kategori spørgsmålet ellers hører hjemme i gerne.

Jeg skal opbygge en automatisk proces hvor jeg direkte uploader en fil (fils indhold) fra en klientmaskine til en webserver. Filen skal modtages og behandles af et PHP script.

Jeg ved det involverer en POST request af formen "multipart/form-data", men er der nogen her på Eksperten der kan give mig et konkret eksempel på hvordan sådan en request reelt ser ud ? Det må gerne være i form af et PHP script der genererer et sådant.

Processen involverer ikke en browser, hvorfor forslag om anvendelse af <input type=file> ikke er relevante.

Det er en tekstfil der skal uploades, men jeg vil også meget gerne se et eksempel på overførsel af en binær fil.
Avatar billede erikjacobsen Ekspert
08. maj 2003 - 21:15 #1
Du kan da vist gøre med programmet curl, som du kan gøre i et shellscript
eller bat-fil - helt uden browser.
Avatar billede dmcn Praktikant
08. maj 2003 - 21:15 #2
Vil du køre via POST, *skal* du køre det via et file-felt, som du for øvrigt ikke kan køre uden interaktion fra brugeren bag skærmen.
Ellers skal du kigge på PHP's FTP-funktioner, hvilket igen kræver en form - www.php.net/ftp for mere info.
Avatar billede erikjacobsen Ekspert
08. maj 2003 - 21:22 #3
Lidt docs fra curl:

-F/--form <name=content>
    (HTTP)  This lets curl emulate a filled in form in which a user has
    pressed the submit button. This causes curl to POST data using  the
    content-type multipart/form-data according to RFC1867. This enables
    uploading of binary files etc. To force the 'content' part to be be
    a  file,  prefix the file name with an @ sign. To just get the con­
    tent part from a file, prefix the file name with the letter <.  The
    difference between @ and < is then that @ makes a file get attached
    in the post as a file upload, while the < makes a  text  field  and
    just get the contents for that text field from a file.

    Example, to send your password file to the server, where 'password'
    is the name of the form-field to  which  /etc/passwd  will  be  the
    input:

      curl -F password=@/etc/passwd www.mypasswords.com
Avatar billede larsvn Nybegynder
08. maj 2003 - 21:34 #4
Hmm, jeg ville helst være fri for at "shelle" mig til en løsning. Og FTP dur slet ikke. Formatet af selve POST request'en vil stadig være nr. 1.

Jeg leder kort sagt efter det format der skal sendes til webserveren, så PHP-scriptet får de nødvendige oplysninger, nemlig filens indhold. Jeg har tidligere anvendt PHP til direkte at foretage et alm. POST request som angivet nedenfor, og jeg leder umiddelbart efter noget lignende.

function SERVICElogin($uname, $pword) {
  $request  = 'login='    . urlencode($uname);
  $request .= '&password=' . urlencode($pword);
  $header  = "POST /service/login.asp HTTP/1.0\r\n";
  $header .= "Content-type: application/x-www-form-urlencoded\r\n";
  $header .= "Content-length: " . strlen($request) . "\r\n\r\n";
  $fp = fsockopen('www.myserver.dk', 80, &$err_num, &$err_msg, 30);
  if ($fp) {
    fputs($fp, $header . $request);
    while (!feof($fp)) $response .= fgets($fp, 2048);
  }
  return $response;
}

Det er måske mere et rent HTTP-spørgsmål når jeg tænker nærmere over det, men der er vist ingen kategori for "ren HHTP" på Eksperten !?
Avatar billede erikjacobsen Ekspert
08. maj 2003 - 22:19 #5
Nu skal du ikke hænge dig så meget i de kategorier ... det passer da
nogenlunde.

Godt, jeg misforstod hvor PHP skulle anvendes - jeg troede ved
modtagelsen, og du mente ved afsendelsen.

phpclasses.org har en fin en til det:


Class: Upload

Short description:
The Upload class is a wrapper for uploading files using html forms.

Detailed description:
The Upload class is a wrapper for uploading files using html forms. The form should have the 'enctype="multipart/form-data"' attribute for this the files to be uploaded properly. The Class should be created by passing $HTTP_POST_FILES as the only argument for the constructor (e.g. $upload = new Upload(&$HTTP_POST_FILES)), and also by reference (the & indicates this). See http://www.sloppycode.net/sloppycode/PHP/cm13.html for the manual.

Den hedder package/348.html - men jeg kan ikke give dig et direkte
link, da man skal være registreret for at få fingre i koden.
Avatar billede erikjacobsen Ekspert
08. maj 2003 - 22:20 #6
Nej, hov - det er da en forkert en ... den modtager - ikke afsnder.
2 secs. Jeg kigger lige igen
Avatar billede erikjacobsen Ekspert
08. maj 2003 - 22:22 #7
Jeg ramte et link ved siden af det rigtige fra min søgning:
package/576.html




Detailed description:



A http client class which Supports :
* HTTP Proxy without proxy Authentication (Authentication is in todo list)
* multipart/form-data AND application/x-www-form-urlencoded
* GET, HEAD and POST methods
* Http cookies
* Chunked Transfer-Encoding
* HTTP 1.0 and 1.1 protocols
* Keep-Alive Connections
* Basic Auth (thanx to Mate Jovic)
Avatar billede larsvn Nybegynder
09. maj 2003 - 11:29 #8
Hej Erik, Nej du ramte faktisk rigtigt første gang. Det var mig der ikke formulerede mig særlig godt.

Jeg er stadig interesseret i selve request'en som tekst. Det er et VB-program der skal sende den (til et PHP-script), men selvom det blev vist som en stump PHP-kode så skulle jeg nok kunne dechifrere det. Det var det jeg mente.

Men jeg er blevet lidt i tvivl i mellemtiden. Jeg har hele tiden antaget at man kunne sende filens indhold i selve requesten, lidt ligesom man kan i en multipart-email (med både ascii og binær), men funderer nu over om browseren faktisk uploader filen separat når man submitter en form som multipart/form-data ?? I PHP får man jo "kun" en server-side kopi stillet til rådighed, hvilket jo intet siger om hvordan den er transporteret fra klient til server.

Men jeg skal nok kigge på de links du har givet mig.
Avatar billede erikjacobsen Ekspert
09. maj 2003 - 11:35 #9
Den bliver skam sendt i requesten - og formatet er såmænd simpelt nok,
jeg ville bare skåne dig for at skulle programmere det ... :)

Kan VB ikke kalde eksterne programmer? Curl til Windows kan jo klare det
for dig uden programmering?

Ellers kig på den første pakke - det er PHP, og kan vel deciffreres.
Avatar billede erikjacobsen Ekspert
09. maj 2003 - 11:36 #10
Sorry ... den anden pakke. Den sender, vha af PHP, en fil til
en anden server, som om det var en browser med <input type=file>
Avatar billede larsvn Nybegynder
09. maj 2003 - 14:54 #11
Takker Erik,
Tjo, Curl for Windows lyder jo fint. Er det stadig command line-udgaven vi taler om dér, eller ved du om der findes en VB-kompatibel DLL-udgaven et-eller-andet sted ? - jeg antager ikke OS-folkene gør så meget indenfor ActiveX ;-)

Desværre er cUrl-kildekoden jo til CygWin, ikke VC++, så jeg har ikke mod på selv at bygge en sådan DLL her-og-nu.

Ellers er jeg ikke bange for at få "beskidte" hænder i min programmering, så hvis du har et eksempel på en "rå" request liggende vil jeg være meget taknemlig. Jeg har tærsket W3C-dokumenterne, men de er meget svære at overskue.
Avatar billede erikjacobsen Ekspert
09. maj 2003 - 15:07 #12
Du henter bare en curl.exe - jeg ved ikke, men det burde da ikke være
noget større problem at afvikle den.
Avatar billede tkandersen Nybegynder
12. maj 2003 - 02:37 #13
Kan du ikke bruge dit eget eksempel og blot sende indholdet af filen der hvor du sætter dit request ind?
På php siden kan du vel hente den med $HTTP_RAW_POST_DATA - og selv behandle de rå indkomne data. Du kunne eventuelt smide filnavnet med først og adskille dem med chr(10) - splitte $HTTP_RAW_POST_DATA på tegnet chr(10) så du har et array med filnavnet og fil indhold for sig.

Jeg har ikke testet det, men du var ikke bange for at få "beskidte" hænder, så tænkte jeg på denne mulige løsning.
Avatar billede larsvn Nybegynder
18. maj 2003 - 20:33 #14
Sorry, jeg har været en smule optaget andetsteds, og er først nu tilbage.

tkandersen: Det lyder som en fin løsning, men jeg ka' s'gutte finde $HTTP_RAW_POST_DATA i PHP-manualen (4.2.3) !?! Men jeg antager at det svarer til niveauet under "key=value"-laget, dvs. uden nogen form for dekodning der modtages som én streng-variabel ? Og at jeg vil kunne sende baduljen lidt lissom det eksempel jeg referer i min kommentar á 8/5 ??
Avatar billede larsvn Nybegynder
20. november 2003 - 09:30 #15
tkandersen: hvis du kan guide mig til hvor jeg finder $HTTP_RAW_POST_DATA (i 4.3.2) så vil du kunne få point. Ellers lukker jeg spørgsmålet snarest.
Avatar billede larsvn Nybegynder
12. februar 2004 - 13:27 #16
Jeg fandt selv formatet for den rå POST-meddelelse, og det var hvad jeg skulle bruge. Opbyg meddelelsen, åben med fsockopen og send meddelelsen med fputs. Nemt og smertefrit!

Og så fandt jeg ved samme lejlighed også ud af at ASP (modsat PHP) slet ikke håndterer fil-uploads på nogen intelligent måde !?! :-D  I ASP skal man åbenbart selv dekode hele den rå POST-meddelelse i sit script ifm. fil-upload - what a drag: PHP Rules ! Det kan selvfølgelig også have været en dårlig/doven ASP-programmør der var på spil .... ?
Avatar billede erikjacobsen Ekspert
12. februar 2004 - 13:34 #17
I ASP bruger man en "upload-komponent", som typisk er en DLL skrevet i C eller
lignende, der skal installeres på serveren.

Godt eller skidt? Der er een indbygget i PHP, men man kan selv vælge hvilken
man vil bruge i ASP.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester

IT-JOB