Avatar billede pmn Nybegynder
18. marts 2006 - 20:39 Der er 14 kommentarer

Upload billede fil vha. WebClient og POST

Jeg ønsker kort fortalt at kunne uploade et billede vha. fx www.imageshack.us, det burde kunne lade sig gøre eftersom der findes en <FORM ... på denne side.

Jeg er ved at gå ude af mit gode skind, da jeg har prøvet alt, men jeg kan ikke få System.Web.WebClient til at uploade billedet...

Der er 60 point på højkant, til den der løser min problematik  eller kan hjælpe mig i den rigtige retning ;)
Avatar billede arne_v Ekspert
18. marts 2006 - 20:58 #2
hvordan ser din kode ud ?
Avatar billede arne_v Ekspert
18. marts 2006 - 21:00 #3
Jeg lavede engang noget upload kode med HttpWebRequest til at uploade mere end
en fil ad gangen med:

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

public class FileUpload
{
    private const string BOUNDARY = "ArneArne";
    public static void Main(string[] args)
    {
        //upload("http://localhost/upload2.php", "C:\\z.c", "C:\\z.exe");
        upload("http://localhost/upload.php", "C:\\z.c", "C:\\z.exe");
    }
    public static void upload(string url, string textfile, string 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-disposition: attachment; name=\"filename[1]\"; filename=\"" + textfile + "\"");
        post.WriteLine("Content-disposition: attachment; name=\"textfile\"; filename=\"" + textfile + "\"");
        post.WriteLine("Content-type: text/plain");
        post.WriteLine("");
        StreamReader txtf = new StreamReader(new FileStream(textfile, FileMode.Open));
        string line;
        while((line = txtf.ReadLine()) != null)
        {
            post.WriteLine(line);
        }
        txtf.Close();
        post.WriteLine("--" + BOUNDARY);
        //post.WriteLine("Content-disposition: attachment; name=\"filename[2]\"; filename=\"" + binfile + "\"");
        post.WriteLine("Content-disposition: attachment; name=\"binfile\"; 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
18. marts 2006 - 21:00 #4
den virkede fint med det PHP script

men jeg tror senere at jef fandt et par små rettelser da jeg skulle uploade til JSP
Avatar billede arne_v Ekspert
18. marts 2006 - 21:02 #5
ah - her er den version:

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();
    }
}

dette eksempel er så ikke 2 filer men en beskrivelse + en fil
Avatar billede lp-freak Nybegynder
18. marts 2006 - 21:04 #6
hvad sker der? skulle han bruge et script til at uploade billeder, eller en side hvór han kunne uploade dem?!
Avatar billede arne_v Ekspert
18. marts 2006 - 21:09 #7
jeg læser spørgsmålet som at at det er client kode til upload

(noget kode som uploader på samme måde som en browser)
Avatar billede pmn Nybegynder
19. marts 2006 - 12:58 #8
Arne har ret det er formålet :)
Avatar billede pmn Nybegynder
19. marts 2006 - 13:44 #9
men jeg havde mere forestillet mig noget i denne retning...
---------------------------
public static void Main(string[] args)
{
    WebClient wc = new WebClient();
    byte[] fileBytes = ReadWholeArray(File.OpenRead("C:\\abc.jpg"));
    byte[] result = wc.UploadData("http://imageshack.us//upload.php", "POST", fileBytes);

    ASCIIEncoding ase = new ASCIIEncoding();
    Console.WriteLine( ase.GetString(result));
}

public static byte[] ReadWholeArray(Stream stream)
{

    byte[] data = new byte[stream.Length];
    int offset = 0;
    int remaining = data.Length;
    while (remaining > 0)
    {
        int read = stream.Read(data, offset, remaining);
        if (read <= 0)
            throw new EndOfStreamException
                (String.Format("End of stream reached with {0} bytes left to read", remaining));
        remaining -= read;
        offset += read;
    }
    return data;
}
Avatar billede pmn Nybegynder
19. marts 2006 - 13:45 #10
som i øvrigt ikke virker. Men hvad er det jeg gør galt, jeg har også prøvet at bruge webclient.uploadfile, det virker heller ikke??
Avatar billede arne_v Ekspert
20. marts 2006 - 04:03 #11
din ReadWholeArra kan sagtens kombineres med min HttpWebRequest POST
Avatar billede pmn Nybegynder
20. marts 2006 - 09:29 #12
Hvad bruges BOUNDARY til i dit eksempel. Skal man selv håndterer de forskellige felter i <FORM> delen fra ImageShack. Sådan her ser den, adressen er iøvrigt http://imageshack.us:

<form method="post" action="http://www.imageshack.us/" enctype="multipart/form-data" onsubmit="disableme('butan')" id="upform">
<table cellspacing="0" cellpadding="0" border="0"><tr>

<td><p style="font-size: 11px;">upload: <input type="radio" name="uploadtype" onclick="toggleuploadmode(true);" checked>
file <input type="radio" name="uploadtype" onclick="toggleuploadmode(false);"> url</p></td>


<td width="2">&nbsp;</td>

<td><div id="upfile"><input type="file" name="fileupload" size="30" onchange="showoptions(this)" id="fileupload"></div>
<div id="upurl" style="display: none"><input type="text" id="fileupload" value="paste image url here" style="color: #888;"
onfocus="focusfield(this)" name="url" size="30"></div></td>

</tr></table>


<input type="hidden" name="MAX_FILE_SIZE" value="3145728">
<input type="hidden" name="refer" value="">
<input type="hidden" name="brand" value="">

<div id="resizeoptions">
  <input type="checkbox" name="optimage" id="optimage" value="1"  onclick="optsize.disabled=!this.checked"> resize image?
  <select name="optsize" id="optsize">
    <option value="100x100" >100x75 (avatar)</option>
    <option value="150x150" >150x112 (thumbnail)</option>
    <option value="320x320" selected>320x240 (for websites and email)</option>
    <option value="640x640" >640x480 (for message boards)</option>
    <option value="800x800" >800x600 (15-inch monitor)</option>
    <option value="1024x1024" >1024x768 (17-inch monitor)</option>
    <option value="1280x1280" >1280x1024 (19-inch monitor)</option>
    <option value="1600x1600" >1600x1200 (21-inch monitor)</option>
    <option value="resample" >optimize without resizing</option>
  </select>
</div>
<div>
  <input type="checkbox" name="rembar" value="1" > remove size/resolution bar from thumbnail?
</div>

<div id="filetypeerror" style="display: none"> <b style="color: red;">Please select only one of the supported file types:</b><br></div>
<div><img class="para" src="img/hosty.png" alt="hosting" /></div>

<input id="butan" style="width:150px" type="submit" value="host it!">&nbsp;&nbsp;&nbsp;&nbsp;</form>
Avatar billede arne_v Ekspert
20. marts 2006 - 13:23 #13
BOUNDARY adskiller form felter
Avatar billede arne_v Ekspert
22. april 2006 - 21:51 #14
OK ?
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
Kurser inden for grundlæggende programmering

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