Avatar billede brassmaid Nybegynder
23. maj 2006 - 16:55 Der er 12 kommentarer og
1 løsning

Hjælp til en manuel file post

Hej

Jeg har et problem med HttpWebRequest håber i kan hjælpe.

Jeg skal lave en post med en fil som skal sendes til et remotesite. Jeg kan sagtens lave en form der poster filen, men hvordan gør jeg hvis det hele skal laves i codebehinde?
Avatar billede arne_v Ekspert
23. maj 2006 - 17:06 #1
jeg lavede for et par aar siden denne her kode (den er lidt speciel fordi
den uploader 2 filer, men du kan se lidt af teknikken):

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 brassmaid Nybegynder
24. maj 2006 - 15:13 #2
den poster fint til siden men det virker ikke helt og jeg kan ikke gennemskue hvad der er galt.
Koden skal gøre det samme som denne form:

<form action="http://localhost/test.php" method="post"  enctype="multipart/form-data">
<input name="uploadfile" type="file" />
<button type="submit">send</button>
</form>

Denne form virker perfekt, kan man ikke få koden til at gøre det samme ?
Avatar billede brassmaid Nybegynder
24. maj 2006 - 15:15 #3
Dette er helt plain html, hvis jeg laver en aspx side med den samme form, skal der stå runat="server" og så laver den om action så den ikke peger på det rigtige sted. Lige nu fatter jeg hat !?! :-(
Avatar billede arne_v Ekspert
24. maj 2006 - 15:42 #4
hvordan ser din kode ud og hvilken fejl faar du ?
Avatar billede brassmaid Nybegynder
24. maj 2006 - 16:29 #5
Lige nu ser min kode således ud

public static void upload(string url, string textfile)
    {
        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=\"uploadfile\"; 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.BaseStream.Flush();
        post.Close();
        HttpWebResponse resp = (HttpWebResponse)req.GetResponse();
        Console.WriteLine(resp.StatusCode);
        resp.Close();
    }
Avatar billede brassmaid Nybegynder
24. maj 2006 - 16:31 #6
jeg kan se at min php side modtager noget, men der sker ingen ting. Når jeg kalder min php side fra formen

<form action="http://localhost/test.php" method="post"  enctype="multipart/form-data">
<input name="uploadfile" type="file" />
<button type="submit">send</button>
</form>

kommer jeg hen på phpsiden og kan se at den skriver ok filen er behandlet, når jeg bruger din kode bliver den kommer jeg aldrig hen på php siden.
Avatar billede arne_v Ekspert
26. maj 2006 - 04:20 #7
Jeg har lige tilrettet lidt kode og testet at det virker.
Avatar billede arne_v Ekspert
26. maj 2006 - 04:20 #8
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/upload.php", "C:\\z.c");
    }
    public static void upload(string url, string textfile)
    {
        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: form-data; name=\"f\"; 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.BaseStream.Flush();
        post.WriteLine("--" + BOUNDARY + "--");
        post.Close();
        HttpWebResponse resp = (HttpWebResponse)req.GetResponse();
        Console.WriteLine(resp.StatusCode);
        resp.Close();
    }
}
Avatar billede arne_v Ekspert
26. maj 2006 - 04:20 #9
<?php
$uploaddir = $_SERVER['DOCUMENT_ROOT'] . "/upload/";
$uploadfile = $uploaddir . basename($_FILES['f']['name']);
move_uploaded_file($_FILES['f']['tmp_name'], $uploadfile);
?>
Avatar billede brassmaid Nybegynder
30. maj 2006 - 16:31 #10
yes det virker :-)

Hvis jeg nu skal have et hiddenfield med, hvordan gør jeg så?

Smid lige et svar så du kan få point
Avatar billede arne_v Ekspert
30. maj 2006 - 16:44 #11
svar
Avatar billede arne_v Ekspert
30. maj 2006 - 16:50 #12
studer foelgende eksempel:

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 brassmaid Nybegynder
31. maj 2006 - 08:25 #13
takker
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