Avatar billede mjall0w Nybegynder
21. april 2009 - 09:02 Der er 8 kommentarer

Upload fil vha. POST formular på hjemmeside

Hej.
Jeg har en side på http://mitdomain.dk/upload.php, der er en ganske simpel HTML post formular.

<form method="post" enctype="multipart/form-data" action="ind.php">
<input name="userfile" type="file">
<input name="upload" type="submit" value=" Upload ">
</form>

Jeg har prøvet at benytte mig at cURL til at lave en filupload, og har benyttet mig af noget længere og mere kompliceret kode, og ydermere har jeg prøvet dette:

            WebClient wc = new WebClient();
            wc.UploadFile(url, "POST", file);

Desværre er der intet der virker. Den poster overhovedet ikke formularen - er helt blank på hvad det kunne være, for den melder ingen fejl, og selve siden hvis man tester den i en browser virker fint.
Kan det skyldes noget med nogle rettigheder der gør man ikke kan fjern uploade?

Er helt på bar bund, håber der er nogle der kan komme med et hint til en løsning.
Avatar billede virtual1ty Nybegynder
21. april 2009 - 10:00 #1
Hvad har du sat variablen url til?
Avatar billede mjall0w Nybegynder
21. april 2009 - 10:10 #2
Har sat fil variablen og url variablen til at være min url, hvor upload formularen er på. "test.htm" hedder den i mit tilfælde. Og så self med domaine osv.
Avatar billede Spotgun Seniormester
21. april 2009 - 10:29 #3
Jeg har lavet noget lignende tidligere. Jeg fik lavet en console app med følgende upload metode, som fungerede fint. Så vidt jeg husker uploadede den filer til en ASP side der benyttede Persits ASPUpload, men det burde vel fungere til din løsning også. Du kan i hvert fald bruge det som inspiration.

Du skal kalde UploadFile med url'en til din upload side, samt den fulde sti til den lokale fil der skal sendes afsted.

    public static int UploadFile(string url, string file)
    {
        Stream requestStream;
        WebResponse response;
        if (!File.Exists(file))
        {
            return -1;
        }
        HttpWebRequest request1 = (HttpWebRequest) WebRequest.Create(url);
        string str = "----------------------------" + DateTime.Now.Ticks.ToString("x");
        HttpWebRequest request = (HttpWebRequest) WebRequest.Create(url);
        request.ContentType = "multipart/form-data; boundary=" + str;
        request.Method = "POST";
        request.KeepAlive = true;
        request.Credentials = CredentialCache.DefaultCredentials;
        byte[] bytes = Encoding.ASCII.GetBytes("\r\n--" + str + "\r\n");
        string format = "Content-Disposition: form-data; name=\"{0}\";filename=\"{1}\"\r\n Content-Type: application/octet-stream\r\n\r\n";
        string s = string.Format(format, "file", file);
        byte[] buffer = Encoding.UTF8.GetBytes(s);
        request.ContentLength = ((new FileInfo(file).Length + buffer.Length) + (bytes.Length * 2)) + 2L;
        try
        {
            requestStream = request.GetRequestStream();
        }
        catch (Exception)
        {
            return -2;
        }
        requestStream.Write(bytes, 0, bytes.Length);
        requestStream.Write(buffer, 0, buffer.Length);
        FileStream stream2 = new FileStream(file, FileMode.Open, FileAccess.Read);
        byte[] buffer3 = new byte[0x1000];
        int count = 0;
        while ((count = stream2.Read(buffer3, 0, buffer3.Length)) != 0)
        {
            requestStream.Write(buffer3, 0, count);
            requestStream.Flush();
        }
        bytes = Encoding.ASCII.GetBytes("\r\n--" + str + "--\r\n");
        requestStream.Write(bytes, 0, bytes.Length);
        requestStream.Close();
        stream2.Close();
        try
        {
            response = request.GetResponse();
        }
        catch (Exception)
        {
            return -3;
        }
        string str4 = new StreamReader(response.GetResponseStream()).ReadToEnd();
        response.Close();
        if (str4 == "1")
        {
            return 0;
        }
        return -4;
    }
Avatar billede Spotgun Seniormester
21. april 2009 - 10:36 #4
Nu jeg tænker tilbage, så returnerede upload siden "1" hvis filen blev uploadet korrekt. Det er det der checkes på til sidst i metoden, for at verificere at filen er nået frem.
Avatar billede Spotgun Seniormester
21. april 2009 - 10:37 #5
Og forresten, så skal du i dit tilfælde kalde http://mitdomain.dk/ind.php, og ikke upload.php.
Avatar billede mjall0w Nybegynder
21. april 2009 - 10:40 #6
Okay. Tusind tak.
Fik det løst.
Først havde jeg programmeret mit PHP script så den brugte if($_POST["Submit"]) - og så kunne den åbenbart ikke få sendt min formular.
Så prøvede jeg at ændre min formular så dens action blev sat til ind.php (så glemte jeg efterfølgende egentlig bare at ændre URL'en til actionen i stedet for formularen.)
Det virker perfekt nu, og jeg bruger cURL, som faktisk gør det overraskende hurtigt!
Og synes egentlig også det er mere overskueligt og lettere end alle de andre måder jeg har set folk på nettet løse det på.


Hvis folk skulle være interesseret i den ser den således ud:
try
            {
                Curl.GlobalInit((int)CURLinitFlag.CURL_GLOBAL_ALL);

                // <form action="http://mybox/cgi-bin/myscript.cgi
                //  method="post" enctype="multipart/form-data">
                MultiPartForm mf = new MultiPartForm();

              //  mf.AddSection(CURLformoption.CURLFORM_COPYNAME, "userid", CURLformoption.CURLFORM_COPYCONTENTS, "1", CURLformoption.CURLFORM_END);
                // <input type="File" name="f1">
                mf.AddSection(CURLformoption.CURLFORM_COPYNAME, "userfile", CURLformoption.CURLFORM_FILE, file, CURLformoption.CURLFORM_CONTENTTYPE, "image/jpeg", CURLformoption.CURLFORM_END);

                Easy easy = new Easy();

                Easy.DebugFunction df = new Easy.DebugFunction(OnDebug);
                easy.SetOpt(CURLoption.CURLOPT_DEBUGFUNCTION, df);
                easy.SetOpt(CURLoption.CURLOPT_VERBOSE, true);

                Easy.ProgressFunction pf = new Easy.ProgressFunction(OnProgress);
                easy.SetOpt(CURLoption.CURLOPT_PROGRESSFUNCTION, pf);

                easy.SetOpt(CURLoption.CURLOPT_URL, url);
                easy.SetOpt(CURLoption.CURLOPT_HTTPPOST, mf);
               
                easy.Perform();
                easy.Cleanup();
                mf.Free();

                Curl.GlobalCleanup();
           
            }
            catch (Exception ex)
            {
                myErrorLabel.Text = ex.ToString();
            }


  public static Int32 OnProgress(Object extraData, Double dlTotal,
        Double dlNow, Double ulTotal, Double ulNow)
        {
            MessageBox.Show("Progress: {0} {1} {2} {3}",
                dlTotal, dlNow, ulTotal, ulNow);
            return 0; // standard return from PROGRESSFUNCTION
        }





        public static void OnDebug(CURLINFOTYPE infoType, String msg,
Object extraData)
        {

            MessageBox.Show(msg);

        }
Avatar billede mjall0w Nybegynder
10. oktober 2010 - 22:32 #7
Selvom jeg fik det løst på min egen metode med en anden tilføjelses klasse virker dit, spotguns, jo også efter hensigt.
Så selvom det er lidt gammelt, må du meget gerne smide et svar og få dine point :)
Avatar billede Spotgun Seniormester
18. februar 2012 - 19:39 #8
Jeg fik vist aldrig lagt et svar her :)
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
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

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