Avatar billede motervejen Nybegynder
15. juli 2004 - 18:10 Der er 20 kommentarer og
1 løsning

"vente-side" når filer uploades til server

Jeg har en application hvor det er muligt at uploade filer. Det virker skam også som det skal. Problemet er at mens filen bliver overført fra clienten til serveren "hænger" siden. Det vil sige at brugeren oplever det som om der ikke sker noget. Min idé er at få lavet det sådan, at brugeren får vist en side hvor der står f.eks. "uploading fil" mens filen bliver overført til serveren...

Koden ser nogenlunde sådan ud i C#:

string fileName = System.IO.Path.GetFileName(fileInput.PostedFile.FileName);
            string directoryPath = Server.MapPath(Application["serverPath"].ToString() + "/files/" + assign.getName());
            if(!System.IO.Directory.Exists(directoryPath))
            {
                System.IO.Directory.CreateDirectory(directoryPath);
            }
           
            bool success = true;
            try
            {
                fileInput.PostedFile.SaveAs(directoryPath + "/" + fileName);
            }
            catch(Exception exc)
            {
                Console.Write(exc.StackTrace);
                success = false;
            }
Avatar billede motervejen Nybegynder
15. juli 2004 - 18:11 #1
Jeg er klar på svar/ideer i både C# VB.NET... Håber på I kan hjælpe :-)
Avatar billede avlund Nybegynder
15. juli 2004 - 18:52 #2
Den kigger jeg lige med på... for det er helt sikkert et interessant spørgsmål.
Avatar billede snepnet Nybegynder
16. juli 2004 - 11:02 #3
Hvis du gerne vil gøre det serverside, og vise brugeren en anden side er det ikke helt lige til, men du får et forslag her om nogle få minutter (skal lige skrive det).
Avatar billede snepnet Nybegynder
16. juli 2004 - 11:12 #4
(bare lige et spørgsmål... har du overvejet at sætte en lille animeret gif-sag, en statusbar eller noget tilsvarende ind clientside istedet ?)

Nå... men du får som skrevet liget et lille eksempel her, hvor du kan få lov til at lave et redirect - uden at miste din HtmlInputFile).
Avatar billede motervejen Nybegynder
16. juli 2004 - 12:31 #5
Det betyder skam ikke så meget om det kører sever- eller client-side. Men jeg må nok indrømme at clientdelen ikke er min stærke side og derfor nok hovedsageligt tænker i server-side løsninger. Hvis du/I mener det kan løses nemmere end den tilgang jeg er igang med, så er jeg meget interesseret...

Men det lyder yderst interessant med en lille smagsprøve :-)
Avatar billede motervejen Nybegynder
16. juli 2004 - 12:42 #6
Nu er det her faktisk mit første spg. her på eksperten. Men det lader til at spørgsmålet er lidt undervurderet iht. point. Så jeg vil faktisk godt udlove 30 point ud over de første 30 til et brugbart svar. (Hvis det altså er god "eksperten-skik" at gøre sådan)
Avatar billede snepnet Nybegynder
16. juli 2004 - 12:53 #7
Undskyld... der kom lige noget arbejde op (har ellers ferie).

Jeg har lavet en lidt hurtig (klamset) løsning til dig... Jeg sætter lige nogle kommentarer ind, og så smider jeg den herud.

Men du kan eventuelt lige sætte aspx-filen op til at starte med... Den kommer her :

// UpLoadFile.aspx
<%@ Page language="c#" Codebehind="UploadFile.aspx.cs" AutoEventWireup="false" Inherits="Motervejen.UploadFile" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" >
<HTML>
    <HEAD>
        <title>WebForm1</title>
        <meta content="Microsoft Visual Studio .NET 7.1" name="GENERATOR">
        <meta content="C#" name="CODE_LANGUAGE">
        <meta content="JavaScript" name="vs_defaultClientScript">
        <meta content="http://schemas.microsoft.com/intellisense/ie5" name="vs_targetSchema">
        <script language="javascript">
        function showUpLoadMessage()
        {                                   
            document.getElementById('UploadMessage').style.visibility = 'visible';   
            UpdateStatus();       
        }
       
        var i = 0;
       
        function UpdateStatus()
        {
            var status = document.getElementById('Status');
           
            if(i>400)
                i=0;
            else
                i++;

            status.style.width=i;   
           
            setTimeout("UpdateStatus()",5);
        }
        </script>
    </HEAD>
    <body ms_positioning="GridLayout">
        <form id="Form1" method="post" runat="server">
            &nbsp; <INPUT id="File1" style="WIDTH: 400px; HEIGHT: 22px" type="file" size="62" name="File1"
                runat="server">
            <DIV id="UploadMessage" style="Z-INDEX: 110; LEFT: 16px; VISIBILITY: hidden; WIDTH: 408px; POSITION: absolute; TOP: 8px; HEIGHT: 100px; BACKGROUND-COLOR: silver"
                ms_positioning="GridLayout">
                Filen er ved at blive uploaded til serveren - vent venligst.
                <br>
                <div id="Status" style="background-color:navy; width:1; height:10;"></div>
            </DIV>
            <INPUT id="Button1" style="Z-INDEX: 102;LEFT: 16px;WIDTH: 400px;POSITION: absolute;TOP: 40px;HEIGHT: 24px"
                type="button" value="Button" name="Button1" runat="server" onclick="showUpLoadMessage();"></form>
    </body>
</HTML>
Avatar billede snepnet Nybegynder
16. juli 2004 - 12:54 #8
// og code-behind for siden :

using System;
using System.Threading;
using System.Collections;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Web;
using System.Web.SessionState;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.HtmlControls;

namespace Motervejen
{
    public class UploadFile : System.Web.UI.Page
    {
        protected System.Web.UI.HtmlControls.HtmlInputButton Button1;
   
        public HtmlInputFile TheFile
        {
            get
            {
                return File1;
            }
        }
        protected System.Web.UI.HtmlControls.HtmlInputFile File1;
   
        private void Page_Load(object sender, System.EventArgs e)
        {
        }

        #region Web Form Designer generated code
        override protected void OnInit(EventArgs e)
        {
            InitializeComponent();
            base.OnInit(e);
        }
       
        private void InitializeComponent()
        {   
            this.Button1.ServerClick += new System.EventHandler(this.Button1_ServerClick);
            this.Load += new System.EventHandler(this.Page_Load);

        }
        #endregion

        private void Button1_ServerClick(object sender, EventArgs e)
        {
            Server.Transfer("FileLoader.aspx", true);
        }
    }
}
Avatar billede snepnet Nybegynder
16. juli 2004 - 12:55 #9
// og så en aspx-fil FileLoader.aspx
// Der er absolut ikke noget på den :o)

<%@ Page language="c#" Codebehind="FileLoader.aspx.cs" AutoEventWireup="false" Inherits="Motervejen.FileLoader" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" >
<HTML>
    <HEAD>
        <title>FileLoader</title>
        <meta name="GENERATOR" Content="Microsoft Visual Studio .NET 7.1">
        <meta name="CODE_LANGUAGE" Content="C#">
        <meta name="vs_defaultClientScript" content="JavaScript">
        <meta name="vs_targetSchema" content="http://schemas.microsoft.com/intellisense/ie5">
    </HEAD>
    <body>
        <form id="Form1" method="post" runat="server">
        </form>
    </body>
</HTML>
Avatar billede snepnet Nybegynder
16. juli 2004 - 12:55 #10
// og code-behind for FileUploader

using System;
using System.Threading;
using System.Collections;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Web;
using System.Web.SessionState;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.HtmlControls;

namespace Motervejen
{
    public class FileLoader : System.Web.UI.Page
    {
        private void Page_Load(object sender, System.EventArgs e)
        {
            if(!IsPostBack)
            {
                // reference til den side der er kaldt fra
                UploadFile caller = (UploadFile)Context.Handler;
           
                // uploading
                Uploader uploader = new Uploader(caller.TheFile);
                Thread t = new Thread(new ThreadStart(uploader.Save));
                Application["Thread"] = t;
                t.Start();

                // udskriv meddelelser til brugeren :
                Response.Write(String.Format("Du har uploaded filen {0}, og den behandles nu på serveren", caller.TheFile.PostedFile.FileName));
            }
        }       

        #region Web Form Designer generated code
        override protected void OnInit(EventArgs e)
        {
            InitializeComponent();
            base.OnInit(e);
        }
       
        private void InitializeComponent()
        {   
            this.Load += new System.EventHandler(this.Page_Load);

        }
        #endregion
    }

    public class Uploader
    {
        HtmlInputFile _fileInputField;

        public Uploader(HtmlInputFile fileInputField)
        {
            _fileInputField = fileInputField;
        }

        public void Save()
        {
            _fileInputField.PostedFile.SaveAs(@"C:\TEMP\Uploads\Fil"+ DateTime.Now.Ticks.ToString() + ".fil");
        }
    }
}
Avatar billede snepnet Nybegynder
16. juli 2004 - 13:03 #11
Den første side sørger for (clientside) at fortælle noget til bruger.
(det tager under alle omstændigheder noget tid at smide filen op på serveren).

Når requested så indgår på serveren (med filen), viderestilles så til en anden side, der kan vise yderligere indformation.
Brugerværdien af denne side er afhængig af hvor meget tid der går på serveren med at gemme filen i filsystem, behandle den, eller hvad der nu skal ske.

Det er lavet så brugeren godt kan bruge den side han/hun kommer frem til, da selve det med at behandle filen køres en en process på serveren.

Læg mærke til at jeg i ovenstående kode har lagt den tråd der gemmer i Application objektet, hvilket egentlig kun er smart hvis det er en proces som alle dine brugere vil have behov for at se status på.

Jeg vil gerne hjælpe med mere omkrinng det, men så kunne det være fedt hvis du fortalte lidt mere om behovet... Filstørrelser, kontekst og den slags.
Avatar billede motervejen Nybegynder
16. juli 2004 - 13:14 #12
Rigitg, rigtig fedt med en løsning! Nu er det bare så ærgeligt at jeg sidder på arbejde :-( Så det går lige lidt tid inden jeg kan kigge lidt nærmere på det og afprøve det. Så jeg vender lige tilbage engang senere på aftenen... Takker!
Avatar billede snepnet Nybegynder
16. juli 2004 - 13:17 #13
Det er bare iorden... Jeg håber du kan bruge det (eller noget af det) til et eller andet :o)

Mvh
Avatar billede motervejen Nybegynder
16. juli 2004 - 23:01 #14
Så nu har jeg lige fået kigget lidt nærmere på din løsning og jeg synes at de ser rigtig spændende ud. Mangler dog lige at afprøve det men jeg vil vil gerne give dig de 60 point. Så hvis du dropper et svar er pointene dine... Godt arbejde ;-)
Avatar billede snepnet Nybegynder
16. juli 2004 - 23:10 #15
Et svar her :o)
Du skriver hvis der er noget omkring det.
Mvh
Avatar billede motervejen Nybegynder
16. juli 2004 - 23:17 #16
Jo tak, det kan være at jeg gør det. Der er nogle ting i din løsning som er nye for mig og som jeg aldrig selv var kommet på. Meget interessant. Det kan være at jeg lader høre mere fra mig ;-)

Her kommer linket til "bonus pointene"

Tusind tak for hjælpen!
Avatar billede motervejen Nybegynder
16. juli 2004 - 23:20 #17
Øhhhh... Her kommer det...

http://www.eksperten.dk/spm/520571
Avatar billede snepnet Nybegynder
16. juli 2004 - 23:59 #18
De 30 point er fint, men det var pænt af dig :o)
Mvh
Avatar billede snepnet Nybegynder
17. juli 2004 - 00:01 #19
Har du fået det til at fungere ?
Avatar billede motervejen Nybegynder
19. juli 2004 - 23:10 #20
Ja, super det virker som det skal. Rigtig god løsning. Og så har jeg også lige lært finten ang. "Server.Transfer()" ;-)
Avatar billede snepnet Nybegynder
19. juli 2004 - 23:32 #21
Fedt :o)
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