Avatar billede kischi Novice
08. januar 2009 - 23:01 Der er 17 kommentarer og
2 løsninger

file upload i IE

Hej jeg prøver at uploade en jpg fil via min hjemmeside.
Og det virker også fint i firefox, men så når jeg prøver det i explorer kommer den med en fejl:
String or binary data would be truncated.
The statement has been terminated.

her er koden jeg bruger:
    protected void opret_Click(object sender, EventArgs e)
    {
        SqlCommand objcmd = new SqlCommand();
        objcmd.CommandType = CommandType.Text;
        objcmd.Connection = objconn;
        objcmd.CommandText = "UPDATE PROGRAM SET titel = @titel, img_url = @img_url WHERE id = @id";
        objcmd.Parameters.AddWithValue("@titel", (titel.Value));
        objcmd.Parameters.AddWithValue("@img_url", FileUpload.Value);
        objcmd.Parameters.AddWithValue("id", Request.QueryString["id"]);

        objconn.Open();

        objcmd.ExecuteNonQuery();

        objconn.Close();

        // Initialize variables

        string sSavePath;
        string sThumbExtension;


        // Set constant values

        sSavePath = "images/";
        sThumbExtension = "_thumb";


        if (FileUpload.PostedFile != null)
        {
            // Check file size (mustn’t be 0)

            HttpPostedFile myFile = FileUpload.PostedFile;
            int nFileLen = myFile.ContentLength;
            if (nFileLen == 0)
            {
                lblOutput.Text = "Du skal uploade en fil.";
                return;
            }

            if (System.IO.Path.GetExtension(myFile.FileName).ToLower() != ".jpg")
            {
                lblOutput.Text = "det skal være en jpg fil";
                return;
            }

            // Read file into a data stream

            byte[] myData = new Byte[nFileLen];
            myFile.InputStream.Read(myData, 0, nFileLen);

            // Make sure a duplicate file doesn’t exist.  If it does, keep on appending an

            // incremental numeric until it is unique

            string sFilename = System.IO.Path.GetFileName(myFile.FileName);
            int file_append = 0;
            while (System.IO.File.Exists(Server.MapPath(sSavePath + sFilename)))
            {
                file_append++;
                sFilename = System.IO.Path.GetFileNameWithoutExtension(myFile.FileName)
                                + file_append.ToString() + ".jpg";
            }

            // Save the stream to disk

            System.IO.FileStream newFile
                    = new System.IO.FileStream(Server.MapPath(sSavePath + sFilename),
                                              System.IO.FileMode.Create);
            newFile.Write(myData, 0, myData.Length);
            newFile.Close();

            // If jpg file is a jpeg, create a thumbnail filename that is unique.

            file_append = 0;
            string sThumbFile = System.IO.Path.GetFileNameWithoutExtension(myFile.FileName)
                                                    + sThumbExtension + ".jpg";
            while (System.IO.File.Exists(Server.MapPath(sSavePath + sThumbFile)))
            {
                file_append++;
                sThumbFile = System.IO.Path.GetFileNameWithoutExtension(myFile.FileName) +
                              file_append.ToString() + sThumbExtension + ".jpg";
            }

du er velkommen til selv at prøve dig frem på:
http://radio.web.surftown.dk/admin/vis_program.aspx

og så klik på skriv beskrivelse, på en af dem.

Det virker i firefox men ikke i explorer.

Er der en som kan hjælpe mig med hvad problemet kunne være?

Tak

Mvh. Adam
Avatar billede Syska Mester
09. januar 2009 - 22:53 #1
holy mother ... det kan gøres meget nemmere :-)

FileUpload fu = new FileUpload();
fu.SaveAs(@"c:\" + fu.PostedFile.FileName);

mvh
Avatar billede kischi Novice
10. januar 2009 - 00:42 #2
Så det du siger er at jeg bare skal erstatte

FileUpload fu = new FileUpload();
fu.SaveAs(@"c:\" + fu.PostedFile.FileName);

med alt det her:

System.IO.FileStream newFile
                    = new System.IO.FileStream(Server.MapPath(sSavePath + sFilename),
                                              System.IO.FileMode.Create);
            newFile.Write(myData, 0, myData.Length);
            newFile.Close();

???
Avatar billede Syska Mester
10. januar 2009 - 01:57 #3
ja, faktisk ...

Kan ikke lige gennemskue alt det kode og hvad du gør ... er træt.

Men alt hvor du bruger FileStream etc. for at gemme filen, kan du gøre med overstående.

Næsten 90% af alt det kode kan du fjerne.

Prøv dig frem :-)

// ouT
Avatar billede kischi Novice
11. januar 2009 - 11:26 #4
Nu har jeg skrevet den kodestump du gav mig.
Men nu kommer den bare med en fejl:
Object reference not set to an instance of an object.

du kan se det på:
http://radio.web.surftown.dk/admin/skriv_beskrivelse.aspx?task=beskrivelse&id=158

Og så skriv en beskrivelse og upload et billede.

Min kode ser sådan ud:

FileUpload fu = new FileUpload();
fu.SaveAs(@"../admin/images/" + fu.PostedFile.FileName);

Jeg har bare ændret stien til min egen.

Jeg prøvede også at skrive "string fu;" oppe i toppen for at declare den. Men det virker ikke.

Ved du hvad problemet kan være?
Avatar billede Syska Mester
11. januar 2009 - 15:28 #5
ja :-)

Du skal selvf bruge den reference til den FileUpload control du har på siden ...

som du har kaldt "FileUpload" :-s ... hvilket ikke er specielt smart da det er 100% det samme som klasse navnet på den control.

Jeg ville nok omdøbe den, så der ikke opstår forvirring.

// ouT
Avatar billede kischi Novice
11. januar 2009 - 17:23 #6
Ok nu prøver jeg så at omdøbbe den, for du har ret i at der opstår nok lidt forvirring.

Su jeg har omdømt den til "fu" så det ser sådan her ud på aspx siden:
indsæt billede:<br /><input id="fu" runat="server" enctype="multipart/form-data" type="file" /><br />

men så ændre jeg jo også navnene på codebehind siden fra FileUpload til fu, men det virker ikke helt der kommer en rød streg un fu nogle af stederne:

HttpPostedFile myFile = fu.PostedFile;

når jeg kører musen hen over står der:

HtmlInputFile admin_skriv_beskrivelse.fu

error:
cannot use local variable 'fu' before it is declared. the decloration of the local variable hides the fiels 'admin_skriv_beskrivelse.fu'

og

FileUpload fu = new FileUpload();

og hvis jeg køre musen over her:
a local variable named 'fu' cannot be declared in this scope because it would give a different meaning to 'fu', witch is already used in a 'parent or current' scope to denote somethoing else

og Value her:

objcmd.Parameters.AddWithValue("@img_url", FileUpload.Value);

og hvis jeg køre over value her:

'System.web.UI.WebControls.FileUpload' does not contain a definition for 'Value' andno extension method 'Value' accepting a first argument of type
'System.web.UI.WebControls.FileUpload' could be found are you missing a using directive or an assembly refference

Ved du hvad problemet kunne være nu?

Mvh. Adam
Avatar billede Syska Mester
11. januar 2009 - 19:17 #7
øhhhh ...

Du skal bruge en ASP.NET control ... der hedder FileUpload.

Dette du er ved at lave er den html syntax der kommer ud af det.

Hvor dælen har du tidligere specificeret den ASP.NET Control .. FileUpload ...

Lader til at det ikke er hele koden du poster ... da FileUpload ikke har en statisk metoder/properties som du bruger ... så hvor kommer den oprindelige "FileUpload" fra ?

// ouT
Avatar billede kischi Novice
11. januar 2009 - 19:31 #8
Hvis jeg har forstået dig rigtigt, så har jeg nu brugt asp.net controlleren på aspx siden.

Men de røde linjer er der stadig.

Nu ser koden sådan ud på aspx siden:
indsæt billede:<asp:FileUpload ID="fu" runat="server"/>

Var det det du mente?

Det ændre jo faktisk ikke noget?
Avatar billede Syska Mester
11. januar 2009 - 20:57 #9
Hvad fejl får du ?

Kan du ikke poste _ALT_ koden ... incl aspx og aspx.cs
Avatar billede Syska Mester
11. januar 2009 - 20:58 #10
Problemet er pt at jeg sidder og gætter på hvad du gør ...

Hvad for nogen linjer er røde? Dem i word ( En joke, heheh ) ... jeg skal bruge noget mere information for at kunne hjælpe ...
Avatar billede Syska Mester
11. januar 2009 - 21:05 #11
Default3.aspx
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default3.aspx.cs" Inherits="Default3" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title></title>
</head>
<body>
    <form id="form1" runat="server">
    <div>
        <asp:FileUpload ID="fu" runat="server" /><asp:Button ID="btn" runat="server"
            Text="Upload file" onclick="btn_Click" />
    </div>
    </form>
</body>
</html>

Default3.aspx.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;

public partial class Default3 : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {

    }
    protected void btn_Click(object sender, EventArgs e)
    {
        fu.SaveAs(Server.MapPath("./testfil"));
    }
}

Følgende virker
Avatar billede kischi Novice
11. januar 2009 - 21:30 #12
De ting der er en rød streg under det er:
Det er kun ordet "fu" der er rød streg under ikke hele linjen.

HttpPostedFile myFile = fu.PostedFile;

når jeg kører musen hen over står der:

HtmlInputFile admin_skriv_beskrivelse.fu

error:
cannot use local variable 'fu' before it is declared. the decloration of the local variable hides the fiels 'admin_skriv_beskrivelse.fu'

og

FileUpload fu = new FileUpload();

og hvis jeg køre musen over her:

a local variable named 'fu' cannot be declared in this scope because it would give a different meaning to 'fu', witch is already used in a 'parent or current' scope to denote somethoing else

Alt min kode ser sådan ud på aspx siden:

<%@ Page Title="" Language="C#" MasterPageFile="~/admin/MasterPage.master" AutoEventWireup="true" CodeFile="skriv_beskrivelse.aspx.cs" Inherits="admin_skriv_beskrivelse" %>

<asp:Content ID="Content1" ContentPlaceHolderID="head" Runat="Server">
</asp:Content>
<asp:Content ID="Content2" ContentPlaceHolderID="ContentPlaceHolder1" Runat="Server">



Titel:<br /><textarea id="titel" cols="35" runat="server" rows="7"></textarea><br /><br />

indsæt billede:<asp:FileUpload ID="fu" runat="server"/>
<!--<br /><input id="fu" runat="server" enctype="multipart/form-data" type="file" /><br />-->
   

<asp:Image ID="imgPicture" Width="160" Height="120" runat="server" /><br />

<asp:Button ID="opret" runat="server" Text="opret beskrivelse" OnClick="opret_Click"/>

<asp:Label ID="lblOutput" runat="server"></asp:Label><br />

</asp:Content>

og alt min kode på aspx.cs siden ser sådan her ud:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Data;
using System.Configuration;
using System.Collections;
using System.Web.Security;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using System.Data.SqlClient;
using System.Data.Common;
using System.Data.OleDb;



public partial class admin_skriv_beskrivelse : System.Web.UI.Page
{
    SqlConnection objconn = new SqlConnection(ConfigurationManager.ConnectionStrings["connectionstring"].ToString());

    protected void Page_Load(object sender, EventArgs e)
    {

    }

    protected void opret_Click(object sender, EventArgs e)
    {
        SqlCommand objcmd = new SqlCommand();
        objcmd.CommandType = CommandType.Text;
        objcmd.Connection = objconn;
        objcmd.CommandText = "UPDATE PROGRAM SET titel = @titel, img_url = @img_url WHERE id = @id";
        objcmd.Parameters.AddWithValue("@titel", (titel.Value));
        objcmd.Parameters.AddWithValue("@img_url", fu.Value);
        objcmd.Parameters.AddWithValue("id", Request.QueryString["id"]);

        objconn.Open();

        objcmd.ExecuteNonQuery();

        objconn.Close();

        // Initialize variables
       
        string sSavePath;
        string sThumbExtension;
     

        // Set constant values

        sSavePath = "images/";
        sThumbExtension = "_thumb";


        if (fu.PostedFile != null)
        {
            // Check file size (mustn’t be 0)

            HttpPostedFile myFile = fu.PostedFile;
            int nFileLen = myFile.ContentLength;
            if (nFileLen == 0)
            {
                lblOutput.Text = "Du skal uploade en fil.";
                return;
            }

            if (System.IO.Path.GetExtension(myFile.FileName).ToLower() != ".jpg")
            {
                lblOutput.Text = "det skal være en jpg fil";
                return;
            }

            // Read file into a data stream

            byte[] myData = new Byte[nFileLen];
            myFile.InputStream.Read(myData, 0, nFileLen);

            // Make sure a duplicate file doesn’t exist.  If it does, keep on appending an

            // incremental numeric until it is unique

            string sFilename = System.IO.Path.GetFileName(myFile.FileName);
            int file_append = 0;
            while (System.IO.File.Exists(Server.MapPath(sSavePath + sFilename)))
            {
                file_append++;
                sFilename = System.IO.Path.GetFileNameWithoutExtension(myFile.FileName)
                                + file_append.ToString() + ".jpg";
            }

            // Save the stream to disk

          // System.IO.FileStream newFile
                  //  = new System.IO.FileStream(Server.MapPath(sSavePath + sFilename),
                                            //  System.IO.FileMode.Create);
          // newFile.Write(myData, 0, myData.Length);
          // newFile.Close();

            FileUpload fu = new FileUpload();
            fu.SaveAs(@"../admin/images/" + fu.PostedFile.FileName);

           

            // If jpg file is a jpeg, create a thumbnail filename that is unique.

            file_append = 0;
            string sThumbFile = System.IO.Path.GetFileNameWithoutExtension(myFile.FileName)
                                                    + sThumbExtension + ".jpg";
            while (System.IO.File.Exists(Server.MapPath(sSavePath + sThumbFile)))
            {
                file_append++;
                sThumbFile = System.IO.Path.GetFileNameWithoutExtension(myFile.FileName) +
                              file_append.ToString() + sThumbExtension + ".jpg";
            }
        }
    }
}


Håber du kan hjælpe mig ud fra det som jeg har skrevet?
Avatar billede kischi Novice
12. januar 2009 - 13:22 #13
Hej, nu fandt jeg ud af hvordan jeg rettede mit oprindelige problem.
i starten istedet for at skrive:
objcmd.Parameters.AddWithValue("@img_url", FileUpload.Value);

så skriver jeg:
objcmd.Parameters.AddWithValue("@img_url", FileUpload.Filename);

for kun at få filnavnet.

Men jeg vil lige prøve at lave fileupload funktionen på den anden måde også.
Uden alle de der filestream. :-D

Tak for hjælpen :-D
Avatar billede Syska Mester
12. januar 2009 - 13:47 #14
Hvad er så problemet nu ?

Du kan jo se i mit eksempel hvordan jeg har gjort og det virker.

Ved ikke om din egen <input id="fu"/> msåke skaber problemer selvom den er kommenteret ud.

Jeg forstår stadig ikke du har alt det stream kode ... 100% overflødig da du kan bruge SaveAs på din FileUpload control.

// ouT
Avatar billede kischi Novice
12. januar 2009 - 14:14 #15
Der er faktisk ikke noget problem nu, det virker nu.

Men jeg vil bare for at lære det ordentligt også prøve at lave file upload funktionen uden alt det der stream.
Fordi det gør det hele mere uoverskueligt.

Så næste gang jeg skal lave fileupload vil jeg gøre det på en anden måde.
Avatar billede Syska Mester
13. januar 2009 - 02:59 #16
"Men jeg vil bare for at lære det ordentligt også prøve at lave file upload funktionen uden alt det der stream.
Fordi det gør det hele mere uoverskueligt. "

Ikke helt med på hvad du præcis mener her ... :-s

SaveAs bruger den stream intern. Eneste gang jeg brugte den, var da jeg modtog et billede som skulle smides forbi en resize funktion.

Men jeg går ud fra at jeg skal smide et svar, da du jo siger problemet er løst.
Avatar billede kischi Novice
13. januar 2009 - 10:33 #17
"Næsten 90% af alt det kode kan du fjerne."

Jeg mener bare at du sagde jo tidligere at jeg kunne slette meget af min kode, så jeg siger bare at jeg vil prøve at lave fileupload nu i et nyt dokument på en anden måde. Så det bliver overskueligt.

Hvis du ikke forstår mig nu, gør det ikke noget, fordi det hele virker som det skal.

Jeg sagde det bare. :-D
Avatar billede Syska Mester
13. januar 2009 - 13:26 #18
ja ... og mener stadig at du kan fjerne 90% af det kode ...

Du kan jo se den løsning jeg har lavet ... eneste ting der ikke gør er at sikre sig at brugen reelt set har valgt en fil ... og at filen er med gyldig extension.

// ouT
Avatar billede kischi Novice
13. januar 2009 - 13:42 #19
Ja ok, 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