Avatar billede -xyz- Nybegynder
21. maj 2005 - 02:22 Der er 24 kommentarer og
1 løsning

WebClient problemer

Hej, jeg har lige et par spm. angående webclient.

Kan det lade sig gøre at opbygge en kø og så flushe den så det derved bliver muligt at sende både billeder og values videre til eet script?
Kan det virkelig ikke lade sig gøre at tildele uploadfile med et name?

for reference ser min kode ud som følger:

WebClient wc = new WebClient();
            wc.Encoding = Encoding.UTF8;
            wc.UploadFile(url, binfile);
            NameValueCollection nvc = new NameValueCollection();
            nvc.Add("vareid", ID.ToString());
            nvc.Add("navn", titel);
            nvc.Add("kat", kat+"."+lvl);
            nvc.Add("indhold", beskrivelse.ToString());
            wc.UploadValues(url, nvc);

Kenneth
Avatar billede arne_v Ekspert
21. maj 2005 - 09:14 #1
Jeg mener kun at WebClient kan sende en part.

WebRequest kan sende multi part.
Avatar billede -xyz- Nybegynder
21. maj 2005 - 12:06 #2
Hmm, det var ærgeligt...
Jeg kan ikke rigtigt få Det der Webrequest til at virke...
Avatar billede -xyz- Nybegynder
21. maj 2005 - 14:38 #3
Lige PT ser min kode ud som følger:
Den uploader fint billedet, men ikke values, kan du lige umiddelbart se hvad der er i vejen?

string BOUNDARY = "OK";
            File.Copy(binfile, binfile = Path.GetFileName(binfile));
            HttpWebRequest req = (HttpWebRequest)WebRequest.Create(url);
            req.Method = "POST";
            req.ContentType = "multipart/form-data, boundary=" + BOUNDARY;
            StreamWriter post = new StreamWriter(req.GetRequestStream());
            post.WriteLine("--" + BOUNDARY);
            post.WriteLine("Content-type: text/plain");
            post.WriteLine("");
            post.WriteLine("?indhold="+beskrivelse+"&navn="+titel+"&kat="+kat+"&lvl="+lvl+"&vareid="+ID);
            post.WriteLine("--" + BOUNDARY);
            post.WriteLine("Content-disposition: attachment; name=\"billede\"; filename=\"" + binfile + "\"");
            post.WriteLine("Content-type: application/octet-stream");
            post.WriteLine("Content-Transfer-Encoding: binary");
            post.WriteLine("");
            post.Flush();
            Stream binf = new FileStream(binfile, FileMode.Open);
            int c;
            while ((c = binf.ReadByte()) >= 0)
            {
                post.BaseStream.WriteByte((byte)c);
            }
            binf.Close();
            post.BaseStream.Flush();
            post.Close();
            HttpWebResponse resp = (HttpWebResponse)req.GetResponse();
            Console.WriteLine(resp.StatusCode);
            resp.Close();
Avatar billede arne_v Ekspert
21. maj 2005 - 15:03 #4
Prøv:

post.WriteLine("Content-type: application/x-www-form-urlencoded");
post.WriteLine("");
post.WriteLine("indhold="+beskrivelse+"&navn="+titel+"&kat="+kat+"&lvl="+lvl+"&vareid="+ID);
Avatar billede -xyz- Nybegynder
21. maj 2005 - 16:00 #5
Mener du det her, for det hjælper ikke, stadig ingen værdier
Avatar billede -xyz- Nybegynder
21. maj 2005 - 16:00 #6
string BOUNDARY = "OK";
            File.Copy(binfile, binfile = Path.GetFileName(binfile));
            HttpWebRequest req = (HttpWebRequest)WebRequest.Create(url);
            req.Method = "POST";
            req.ContentType = "multipart/form-data, boundary=" + BOUNDARY;
            StreamWriter post = new StreamWriter(req.GetRequestStream());
         
            post.WriteLine("Content-type: application/x-www-form-urlencoded");
            post.WriteLine("");
            post.WriteLine("indhold=" + beskrivelse + "&navn=" + titel + "&kat=" + kat + "&lvl=" + lvl + "&vareid=" + ID);
            post.WriteLine("--" + BOUNDARY);
            post.WriteLine("Content-disposition: attachment; name=\"billede\"; filename=\"" + binfile + "\"");
           
            post.WriteLine("Content-Transfer-Encoding: binary");
            post.WriteLine("");
            post.Flush();
            Stream binf = new FileStream(binfile, FileMode.Open);
            int c;
            while ((c = binf.ReadByte()) >= 0)
            {
                post.BaseStream.WriteByte((byte)c);
            }
            binf.Close();
            post.BaseStream.Flush();
            post.Close();
            HttpWebResponse resp = (HttpWebResponse)req.GetResponse();
            Console.WriteLine(resp.StatusCode);
            resp.Close();
Avatar billede arne_v Ekspert
21. maj 2005 - 16:56 #7
hmmm - måske kan upload scriptet ikke håndtere det

har du prøvet at lave en simpel upload - kun med fil men angive
de parametre i URL'en ?
Avatar billede arne_v Ekspert
21. maj 2005 - 16:57 #8
wc.UploadFile(url + "?indhold="+beskrivelse+"&navn="+titel+"&kat="+kat+"&lvl="+lvl+"&vareid="+ID, binfile);
Avatar billede -xyz- Nybegynder
22. maj 2005 - 02:56 #9
Scriptet virker, jeg bruger det med en php form, så jeg ved at det virker... den sender bare ikke post variablerne med i applikationen
Avatar billede -xyz- Nybegynder
22. maj 2005 - 11:29 #10
Hmmm tror jeg skriver direkte til databasen i stedet for så...
Avatar billede arne_v Ekspert
22. maj 2005 - 13:11 #11
jeg har eksperimenteret lidt

syntaxen er faktisk lidt anderledes

eksempel som virker i test:


using System;
using System.IO;
using System.Net;

public class DataAndFileUpload
{
    private const string BOUNDARY = "ArneArne";
    public static void Main(string[] args)
    {
        upload("http://localhost:8080/test/xuploaddo.jsp", "test", "C:\\last.cpp");
    }
    public static void upload(string url, string description, string filename)
    {
        ServicePointManager.Expect100Continue = false; // to avoid .NET - Tomcat 5 bug
        HttpWebRequest req = (HttpWebRequest)WebRequest.Create(url);
        req.Method = "POST";
        req.KeepAlive = false;
        req.ContentType = "multipart/form-data; boundary=" + BOUNDARY;
        StreamWriter post = new StreamWriter(req.GetRequestStream());
        post.WriteLine("--" + BOUNDARY);
        post.WriteLine("Content-Disposition: form-data; name=\"beskrivelse\"");
        post.WriteLine("");
        post.WriteLine(description);
        post.WriteLine("--" + BOUNDARY);
        post.WriteLine("Content-Disposition: form-data; name=\"fil\"; filename=\"" + filename + "\"");
        //post.WriteLine("Content-Type: text/plain");
        post.WriteLine("Content-type: application/octet-stream");
        post.WriteLine("Content-Transfer-Encoding: binary");
        post.WriteLine("");
        post.Flush();
        Stream binf = new FileStream(filename, FileMode.Open);
        int c;
        while((c = binf.ReadByte()) >= 0) {
            post.BaseStream.WriteByte((byte)c);
        }
        binf.Close();
        post.BaseStream.Flush();
        post.WriteLine("--" + BOUNDARY + "--");
        post.Close();
        HttpWebResponse resp = (HttpWebResponse)req.GetResponse();
        Console.WriteLine(resp.StatusCode);
        resp.Close();
    }
}
Avatar billede -xyz- Nybegynder
23. maj 2005 - 09:04 #12
Det var jo lige sådan at det virkede, det virker i hvertfald hos mig nu, tak for hjælpen, smid et svar for points...
Avatar billede arne_v Ekspert
23. maj 2005 - 09:28 #13
svar
Avatar billede -xyz- Nybegynder
23. maj 2005 - 13:11 #14
Lige et til spm, har du nogen anelse om hvordan man sætter encoding til UTF-8?
Avatar billede arne_v Ekspert
23. maj 2005 - 13:16 #15
prøv:

post.WriteLine("Content-Type: text/plain; charset=UTF-8");
Avatar billede -xyz- Nybegynder
23. maj 2005 - 13:25 #16
Har prøvet dette, men det virker ikke...

  HttpWebRequest req = (HttpWebRequest)WebRequest.Create(url);
            req.Method = "POST";
            req.ContentType = "multipart/form-data,  boundary=" + BOUNDARY+"; charset=utf-8";
            StreamWriter post = new StreamWriter(req.GetRequestStream());
            post.WriteLine("Content-Type: text/plain; charset=UTF-8");
            post.WriteLine("");
            post.WriteLine("--" + BOUNDARY);
            post.WriteLine("Content-Disposition: form-data; name=\"VareID\"");
            post.WriteLine("");
            post.WriteLine(ID);

            post.WriteLine("--" + BOUNDARY);
            post.WriteLine("Content-Disposition: form-data; name=\"kat\"");
            post.WriteLine("");
            post.WriteLine(kat+"."+lvl);

            post.WriteLine("--" + BOUNDARY);
            post.WriteLine("Content-Disposition: form-data; name=\"navn\"");
            post.WriteLine("");
            post.WriteLine(titel);

            post.WriteLine("--" + BOUNDARY);
            post.WriteLine("Content-Disposition: form-data; name=\"indhold\"");
            post.WriteLine("");
            post.WriteLine(beskrivelse);
             
            post.WriteLine("--" + BOUNDARY);
            post.WriteLine("Content-disposition: attachment; name=\"billede\"; filename=\"" + binfile + "\"");
           
            post.WriteLine("Content-Transfer-Encoding: binary");
            post.WriteLine("");
         
            post.Flush();
            Stream binf = new FileStream(binfile, FileMode.Open);
            int c;
            while ((c = binf.ReadByte()) >= 0)
            {
                post.BaseStream.WriteByte((byte)c);
            }
            binf.Close();
            post.BaseStream.Flush();
            post.Close();
            HttpWebResponse resp = (HttpWebResponse)req.GetResponse();

            Console.WriteLine(resp.StatusCode);
            //resp.Close();
Avatar billede arne_v Ekspert
23. maj 2005 - 15:34 #17
jeg mente nu

            StreamWriter post = new StreamWriter(req.GetRequestStream());
            post.WriteLine("--" + BOUNDARY);
            post.WriteLine("Content-Disposition: form-data; name=\"VareID\"");
            post.WriteLine("Content-Type: text/plain; charset=UTF-8");
            post.WriteLine("");
            post.WriteLine(ID);
Avatar billede -xyz- Nybegynder
23. maj 2005 - 17:13 #18
Tak det virker, har god du en artikel om webrequest? så slipper jeg for at spørge hvergang
Avatar billede arne_v Ekspert
23. maj 2005 - 17:17 #19
næh

men hvis du kender lidt til Java kan jeg foreslå at de henter Apache Axis
toolkittet - det har en fix lille utility tcpmon som kan logge både
HTTP request og HTTP response

så kan man jo i ro og mag først hapse den request browseren sender og derefter
den ens eget program sender og finde forskellen
Avatar billede -xyz- Nybegynder
23. maj 2005 - 17:29 #20
HMMM. nej det virker ikke alligevel..
Avatar billede arne_v Ekspert
23. maj 2005 - 17:34 #21
stadigvæk ÆØÅ problemer ?

hvad men at konvertere til CP-1252 i dit program ?
Avatar billede -xyz- Nybegynder
23. maj 2005 - 17:38 #22
Ja, men hvordan?
Avatar billede arne_v Ekspert
23. maj 2005 - 17:42 #23
StreamWriter post = new StreamWriter(req.GetRequestStream(), Encoding.Default);

måske
Avatar billede -xyz- Nybegynder
23. maj 2005 - 17:54 #24
Ok, så det var streamwriteren der skulle encodes, mange tak for det, men jeg får en fejl nu, som der sikkert har været problemer med hele tiden, jeg har bare først opdaget det nu...

når jeg kører upload funktionen 3-4 gange i træk, fryser programmet
nogen idéer?
Avatar billede -xyz- Nybegynder
23. maj 2005 - 17:56 #25
Har fundet fejlen... var en uendelig løkke, ;)

Opretter en tråd med ekstra point som tak for hjælpen, har lært meget af det...
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