Avatar billede dava Nybegynder
14. juni 2004 - 13:08 Der er 14 kommentarer og
1 løsning

Upload filer til webservice

Hejsa, jeg har en windows form hvorfra jeg gerne vil uploade et billede til en webserver via en webservice.
Ideen er at jeg vælger billed-filen vha en OpenFileDialog, sender den til webservicen der så opretter en ny kopi af det sendte billede.
Min kode er som følger:

---- webservice kode ----
private string imageDir = @"C:\Inetpub\Website\images\";
public void SaveImage (string filename, string filedata)
{
  StreamWriter sw = new StreamWriter(imageDir + filename);
  sw.Write(filedata);
  sw.Close();
}

------ windows form kode -------
private Service s = new Service();
if(dialogOpen.ShowDialog() == DialogResult.OK)
{
  string filename = Path.GetFileName(dialogOpen.FileName);

  StreamReader sr = new StreamReader(dialogOpen.FileName);
  string filedata = sr.ReadToEnd();
  s.SaveImage(filename, filedata);
}

Problemet er at det ikke virker helt 100 - Den vil gerne arbejde med rene txt filer med rent text indhold, men ligeså snart jeg prøver med en binary fil så giver den følgende besked:

An unhandled exception of type 'System.Xml.XmlException' occurred in system.xml.dll
Additional information: System error.

Nogen der har lyst til at hjælpe mig på rette vej?
Avatar billede arne_v Ekspert
14. juni 2004 - 13:14 #1
Send filerne base64 encoded.

Serveren dekoder og klienten encoder.
Avatar billede dava Nybegynder
14. juni 2004 - 13:34 #2
Øhh... kan du give et lille eksempel?
Avatar billede arne_v Ekspert
14. juni 2004 - 13:44 #3
Måske senere
Avatar billede dava Nybegynder
14. juni 2004 - 15:37 #4
Okay :)
Har prøvet at rode lidt med base64 (Convert.ToBase64String), men kan ikke lige få det til at virke.
Avatar billede tomjelen Nybegynder
14. juni 2004 - 15:50 #5
Jeg mener at et byte array bliver base64 encoded automatisk. Så hvis du bare opretter en web metode der tager et byte array som input, og så sender et byte array til den, sker det hele automatisk... Måske er det bare en VS ting, men det virkede for mig.

Men der er en eller anden maks størrelse som man kan sende på en 3-4 megabytes.
Avatar billede arne_v Ekspert
14. juni 2004 - 15:53 #6
Hvordan virker det ikke ?

----

Web services er ganske rigtigt ikke nogen god teknologi til fil overførsel generelt
(generelt = hvor der kan komme store filer).
Avatar billede arne_v Ekspert
14. juni 2004 - 20:35 #7
client:

s.SaveImage(filename, Convert.ToBase64String(Encoding.UTF8.GetBytes(filedata)));

server:

sw.Write(Encoding.UTF8.GetString(Convert.FromBase64String(filedata)));
Avatar billede arne_v Ekspert
14. juni 2004 - 20:36 #8
Det er muligvis smartere at læse og skrive filen som byte ...
Avatar billede dava Nybegynder
14. juni 2004 - 21:47 #9
arne_v > Hvordan virker det ikke?

Den gav samme fejl igen.

- Men jeg har prøvet med dit svar og nu kører den fint nok igennem. Ingen XML fejl eller noget. Til gengæld er billedet der gemmes på serveren korrupt. Jeg prøver lige at eksperiementere med det du har givet mig og melder tilbage.
Avatar billede arne_v Ekspert
14. juni 2004 - 22:12 #10
Hvis det er en binær file skal du ikke bruge StreamReader og StreamWriter, da de
er beregnet på text filer.

Brug f.eks. bare FileStream.
Avatar billede dava Nybegynder
14. juni 2004 - 22:51 #11
Puhhh... Nu virker det med FileStream og ConvertTo/FromBase64String.
Jeg er ret ny med C# så det har været en lang dags arbejde at få det her lirket på plads, men det er rart når det så endelig virker. Og så har jeg lært en hel masse undervejs :)
Jeg siger tusind tak for hjælpen!
Avatar billede skov_p Praktikant
09. januar 2006 - 21:50 #12
Er du ikke rar at vise din løsning?
Avatar billede dava Nybegynder
09. januar 2006 - 22:36 #13
Joda... det er godt nok længe siden, menøh så vidt jeg husker så er det det her stykke kode:

            // upload image file to the SaveImage web service
            dialogOpen.Filter = "Image files (*.jpg, *.jpeg, *.png, *.gif)|*.jpg;*.jpeg;*.png;*.gif|All files (*.*)|*.*";
            dialogOpen.Title = "Select Image";

            if(dialogOpen.ShowDialog() == DialogResult.OK)
            {
                // open the selected file and read into bytearray
                FileStream fs = new FileStream(dialogOpen.FileName, FileMode.Open, FileAccess.Read);
                long fileLength = fs.Length;
                byte[] buffer = new byte[fileLength];
                int bufferLength = buffer.Length;
                fs.Read(buffer, 0, bufferLength);
                fs.Close();
               
                // convert to base64 for better handling on SOAP
                string fileData = Convert.ToBase64String(buffer);

                // and get the filename of the selected file
                string fileName = Path.GetFileName(dialogOpen.FileName);
                // save the current button-text for later use               
                string txt = buttonUpload.Text;
                // the web service method SaveImage return true when done,
                // so we'll disable the upload button while sending the data
                bool loader = false;
                while (!loader)
                {
                    loader = service.SaveImage(fileName, fileData);
                    buttonUpload.Text = "...";
                    buttonUpload.Enabled = false;
                }
                // re-enable the button and it's text
                buttonUpload.Enabled = true;
                buttonUpload.Text = txt;
            }
Avatar billede dava Nybegynder
09. januar 2006 - 22:39 #14
- og her er den webservice der bruges:
        [WebMethod( Description = "save image file directly to web image dir.")]
        // fileName = the name of the file being upped
        // fileData = the binary data of the file itself, base64encoded for compatibility with SOAP.
        // this method made with help from www.eksperten.dk spm#509630
        public bool SaveImage (string fileName, string fileData)
        {
            string file = imageDir + fileName;
            int fileLength = Convert.FromBase64String(fileData).Length;
            byte[] fileBytes = Convert.FromBase64String(fileData);

            FileStream fs = new FileStream(file, FileMode.Create, FileAccess.Write);
            fs.Write(fileBytes, 0, fileLength);
            fs.Close();

            return true;
        }
Avatar billede skov_p Praktikant
09. januar 2006 - 23:30 #15
Virker perfekt...

Tak
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