Avatar billede grafikeren Nybegynder
21. december 2005 - 16:17 Der er 2 kommentarer og
1 løsning

System.Drawing.Image.FromStream

Hej.

Jeg er gået i gang med at dyrke C# noget mere og i den forbindelse har jeg været i gang med at lave en billed uploader med automatisk resizer.

Systemet fungerer ligenu ved at brugerens fil gemmes på serveren og bagefter resizer jeg billedet til en mindre størrelse og gemmer det i en ny fil (den gamle fil skal derefter slettes). Det smarteste ville jo være hvis den man kunne resize billedet direkte inden det bliver gemt. Jeg kunne forestille mig at man skulle bruge System.Drawing.Image.FromStream istedet for System.Drawing.Image.FromFile . Jeg har dog prøvet men kan ikke få det til at virke.

Hvis den nuværende løsning med upload er udemærket, så skal jeg ha lidt hjælp til at slette den første uploadede fil igen. Det virker ikke med min slet sætning.

Jeg har udskrevet koden herunder. Ignorer alt database lir, det skal alligevel rettes til senere. Kan nogen hjælpe mig på vej?

using System;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.HtmlControls;
using System.Drawing;
using System.Drawing.Imaging;
using System.IO;
using System.Data;
using System.Data.OleDb;

namespace FileUpload
{
    /// WebForm1.
    public class WebForm1 : System.Web.UI.Page
    {
        private const string MDBFILE = "FileUpload.mdb";

        protected Label lblFile;
        protected HtmlInputFile filMyFile;
        protected System.Web.UI.WebControls.Label lblInfo;
        protected System.Web.UI.WebControls.Label lblOutput;
        protected System.Web.UI.WebControls.Button cmdSend;
        protected System.Web.UI.WebControls.Image imgFile;
        protected System.Web.UI.WebControls.Image imgDB;
        protected System.Web.UI.WebControls.Label lblText1;
        protected System.Web.UI.WebControls.Label lblText2;
   
        override protected void OnInit(EventArgs e)
        {
            InitializeComponent();
            base.OnInit(e);
        }

        private void InitializeComponent()
        {   
            this.Load += new System.EventHandler(this.Page_Load);
            this.cmdSend.Click += new System.EventHandler(this.cmdSend_Click);
        }

        private void Page_Load(object sender, System.EventArgs e)
        {
            // Check if FileID was passed to this page as a parameter
            if( Request.QueryString["FileID"] != null )
            {
                // Get the file out of database and return it to requesting client
                ShowTheFile(Convert.ToInt32(Request.QueryString["FileID"]));
            }
           
        }

        // Processes click on our cmdSend button
        private void cmdSend_Click(object sender, System.EventArgs e)
        {
            // Check to see if file was uploaded
            if( filMyFile.PostedFile != null )
            {
                // Get a reference to PostedFile object
                HttpPostedFile myFile = filMyFile.PostedFile;

                // Get size of uploaded file
                int nFileLen = myFile.ContentLength;

                // make sure the size of the file is > 0
                if( nFileLen > 0 )
                {
               
                    // Check file extension (must be jpg, gif, png, jpeg)
                    string strFileExt = System.IO.Path.GetExtension(myFile.FileName).ToLower();
                    if (strFileExt != ".jpg" && strFileExt != ".jpeg" && strFileExt != ".gif" && strFileExt != ".png")
                    {
                        lblOutput.Text = "The file must have an extension of .jpg, .jpeg, .gif or .png";
                    } else
                    {
                            lblOutput.Text = "The file has been uploaded!";
                           
                            // Allocate a buffer for reading of the file
                            byte[] myData = new byte[nFileLen];
       
                            // Read uploaded file from the Stream
                            myFile.InputStream.Read(myData, 0, nFileLen);
       
                            // Create a name for the file to store
                            string strFilename = Path.GetFileName(myFile.FileName);
       
                            string SavePath = "images/";
                           
                            // Write data into a file
                            WriteToFile(Server.MapPath(SavePath + strFilename), ref myData);
       
                            // Store it in database
                            int nFileID = WriteToDB(strFilename, myFile.ContentType, ref myData);
                           
                                try
                              {
                                               
                                    String imageUrl = SavePath + strFilename;                         
                               
                                    //Create an image object from the uploaded file and determine width and height                               
                                    System.Drawing.Image fullSizeImg = System.Drawing.Image.FromFile(Server.MapPath(imageUrl));                       
                               
                                    int oldW = fullSizeImg.Width;
                                    int oldH = fullSizeImg.Height;               

                                    int imageW = oldW;                               
                                    int imageH;                               
                                    float procent;
                                    int fixedW;
                                   
                                    if (oldH > oldW) //portrait)                               
                                    {                                   
                                        fixedW = 400;
                                        Response.Write("<br><br>Portrait ");                               
                                    } else { // landscape                               
                                        fixedW = 550;
                                        Response.Write("<br><br>Landscape ");                               
                                    }
                                                                   
                                    if (imageW>fixedW)                                
                                    {                                   
                                        //procent = (fixedW/oldW);                               
                                        procent = Convert.ToSingle(fixedW)/Convert.ToSingle(oldW);
                                        imageW = fixedW;
                                    } else {                                 
                                        procent = 1;                               
                                    }
                                   
                                    imageH = Convert.ToInt32(oldH*procent);
                                   
                                    // check
                                    Response.Write("<br><br>oldH: " + oldH);
                                    Response.Write("<br><br>oldw: " + oldW);
                                    Response.Write("<br><br>fixedw: " + fixedW);
                                    Response.Write("<br><br>procent: " + procent);
                                    Response.Write("<br><br>imageURL: " + imageUrl);
                                    Response.Write("<br><br>The image height is: " + imageH);
                                    Response.Write("<br><br>The image weidth is: " + imageW);
                                    Response.Write("<br><br>");
                                 
                                    System.Drawing.Image.GetThumbnailImageAbort dummyCallBack = new System.Drawing.Image.GetThumbnailImageAbort(ThumbnailCallback);
                                    System.Drawing.Image thumbNailImg = fullSizeImg.GetThumbnailImage(imageW, imageH, dummyCallBack, IntPtr.Zero);
                                 
                                    //We need to create a unique filename for each generated image
                                    DateTime MyDate = DateTime.Now;
                                    String MyString  = MyDate.ToString("ddMMyyhhmmss") + ".jpg" ;
                                    // save
                                    thumbNailImg.Save ( Server.MapPath(SavePath) + MyString , ImageFormat.Jpeg);
                                    thumbNailImg.Dispose();
                                   
                                    // delete the resized picture
                                    File.Delete(imageUrl);
                         
                             
                                }
                                catch(Exception ex)
                                {
                                    Response.Write("An error occurred - " + ex.ToString());
                                }   
                           
                            /*
                            // Visning af billederne
                            // Set label's text
                            lblInfo.Text =
                                "Filename: " + strFilename + "<br>" +
                                "Size: " + nFileLen.ToString() + "<p>";
                               
       
                            // Set URL of the the object to point to the file we've just saved
                            imgFile.ImageUrl = SavePath+MyString+".jpg";
                            imgFile.ToolTip = "This file was stored to as file.";
                            lblText1.Text = imgFile.ImageUrl;
                           
                            // show the images and text
                            imgFile.Visible = true;
                            lblText1.Visible = true;
                            */
                       
                    }
               
                   
                }
            }
        }

        // Writes file to current folder
        private void WriteToFile(string strPath, ref byte[] Buffer)
        {
            // Create a file
            FileStream newFile = new FileStream(strPath, FileMode.Create);

            // Write data to the file
            newFile.Write(Buffer, 0, Buffer.Length);

            // Close file
            newFile.Close();
        }

        // Generates database connection string
        private string GetConnectionString()
        {
            return "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + Server.MapPath(MDBFILE) + ";";
        }

        // Writes file to the database
        private int WriteToDB(string strName, string strType, ref byte[] Buffer)
        {
            int nFileID = 0;

            // Create connection
            OleDbConnection dbConn = new OleDbConnection(GetConnectionString());

            // Create Adapter
            OleDbDataAdapter dbAdapt = new OleDbDataAdapter("SELECT * FROM tblFile", dbConn);
           
            // We need this to get an ID back from the database
            dbAdapt.MissingSchemaAction = MissingSchemaAction.AddWithKey;
           
            // Create and initialize CommandBuilder
            OleDbCommandBuilder dbCB = new OleDbCommandBuilder(dbAdapt);

            // Open Connection
            dbConn.Open();
                   
            // New DataSet
            DataSet dbSet = new DataSet();
                   
            // Populate DataSet with data
            dbAdapt.Fill(dbSet, "tblFile");

            // Get reference to our table
            DataTable dbTable = dbSet.Tables["tblFile"];

            // Create new row
            DataRow dbRow = dbTable.NewRow();

            // Store data in the row
            dbRow["FileName"] = strName;
            dbRow["FileSize"] = Buffer.Length;
            dbRow["ContentType"] = strType;
            dbRow["FileData"] = Buffer;

            // Add row back to table
            dbTable.Rows.Add(dbRow);

            // Update data source
            dbAdapt.Update(dbSet, "tblFile");

            // Get newFileID
            if( !dbRow.IsNull("FileID") )
                nFileID = (int)dbRow["FileID"];
           
            // Close connection
            dbConn.Close();

            // Return FileID
            return nFileID;
        }

        // Read file out of the database and returns it to client
        private void ShowTheFile(int FileID)
        {
            // Define SQL select statement
            string SQL = "SELECT FileSize, FileData, ContentType FROM tblFile WHERE FileID = "
                        + FileID.ToString();

            // Create Connection object
            OleDbConnection dbConn = new OleDbConnection(GetConnectionString());

            // Create Command Object
            OleDbCommand dbComm = new OleDbCommand(SQL, dbConn);

            // Open Connection
            dbConn.Open();

            // Execute command and receive DataReader
            OleDbDataReader dbRead = dbComm.ExecuteReader();

            // Read row
            dbRead.Read();

            // Clear Response buffer
            Response.Clear();

            // Set ContentType to the ContentType of our file
            Response.ContentType = (string)dbRead["ContentType"];

            // Write data out of database into Output Stream
            Response.OutputStream.Write((byte[])dbRead["FileData"], 0, (int)dbRead["FileSize"]);

            // Close database connection
            dbConn.Close();

            // End the page
            Response.End();
        }

        // Reads the name of current web page
        private string GetMyName()
        {
            // Get the script name
            string strScript = Request.ServerVariables["SCRIPT_NAME"];

            // Get position of last slash
            int nPos = strScript.LastIndexOf("/");

            // Get everything after slash
            if( nPos > -1 )
                strScript = strScript.Substring(nPos + 1);

            return strScript;
        }
        public bool ThumbnailCallback()
        {
            return false;
        }
       
    }
}
Avatar billede dr_chaos Nybegynder
21. december 2005 - 16:23 #1
Kan du ikke bruge noget i denne stil:
System.Drawing.Image img = new System.Drawing.Image();
img = System.Drawing.Image.FromStream(myFile.InputStream);
hvor du bruger input stream.
Avatar billede grafikeren Nybegynder
21. december 2005 - 19:22 #2
Det virkede med System.Drawing.Image fullSizeImg = System.Drawing.Image.FromStream(myFile.InputStream);

Tak for inspirationen... Jeg går videre med arbejdet.

Læg et svar.
Avatar billede dr_chaos Nybegynder
21. december 2005 - 19:25 #3
svar :)
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