|
This tool is quite cool. But don't you think that the size of the thumbnail should be dependant on the original picture file? Well I do... I get the original picture size, calculate the width/height ratio, initialize only one dimension of the thumbnail size and then... calculate the rest. (floatSizeRatio and intBiggerDim being newly added variables)
// calculate thumbnail size
floatSizeRatio = myBitmap.PhysicalDimension.Height/myBitmap.PhysicalDimension.Width;
if (floatSizeRatio > 1)
{
// portrait image
intThumbHeight = intBiggerDim;
intThumbWidth = (int) (intThumbHeight / floatSizeRatio);
}
else
{
// landscape image
intThumbWidth = intBiggerDim;
intThumbHeight = (int) (intThumbWidth * floatSizeRatio);
}
|
|
|
|
|
I agree that this would be essential. However, if you were to do this the imgPicture should also have its width and Height set in a similar manner.
When I try this, I get the following error:
Value of type 'Integer' cannot be converted to 'System.Web.UI.WebControls.Unit'
Any ideas?
|
|
|
|
|
It seems that when setting the image hight or width, that a Unit is required.
' Calculate the size ratio
dblfloatSizeRatio = mybitmap.PhysicalDimension.Height / mybitmap.PhysicalDimension.Width
If dblfloatSizeRatio > 1 Then
intThumbHeight = intBiggerDim
intThumbWidth = (intThumbHeight / dblfloatSizeRatio)
Else
intThumbWidth = intBiggerDim
intThumbHeight = (intThumbWidth * dblfloatSizeRatio)
End If
Dim mythumbnail As System.Drawing.Image
mythumbnail = mybitmap.GetThumbnailImage(intThumbWidth, intThumbHeight, myCallBack, IntPtr.Zero)
mythumbnail.Save(Server.MapPath(sSavePath + sThumbFile))
ImgPicture.ImageUrl = sSavePath + sThumbFile
' Set the imgPicture height and width
imgPicture.Height = New Unit(intThumbHeight)
imgPicture.Width = New Unit(intThumbWidth)
|
|
|
|
|
do you have to explicitly call the dispose method on the image?
|
|
|
|
|
Is there a way to limit the JPG file size to 100kb?
Thanks.
|
|
|
|
|
Private Sub btnUpload_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnUpload.Click
'Initialize variables
Dim sSavePath As String
Dim sThumbExtension As String
Dim intThumbWidth As Integer
Dim intThumbHeight As Integer
'Set constant values
sSavePath = "~/images/"
sThumbExtension = "_thumb"
intThumbWidth = 160
intThumbHeight = 120
'If file field isn’t empty
If IsNothing(filUpload.PostedFile) = False Then
'Check file size (mustn’t be 0)
Dim myFile As HttpPostedFile = filUpload.PostedFile
Dim nFileLen As Integer = myFile.ContentLength
If nFileLen = 0 Then
lbloutput.Text = "No file was uploaded."
Return
End If
'Check file extension (must be JPG)
If System.IO.Path.GetExtension(myFile.FileName).ToLower() <> ".jpg" Then
lbloutput.Text = "The file must have an extension of JPG"
Return
End If
'Read file into a data stream
Dim myData() As Byte = 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
Dim sFilename As String = System.IO.Path.GetFileName(myFile.FileName)
Dim file_append As Integer = 0
While System.IO.File.Exists(Server.MapPath(sSavePath + sFilename))
file_append = file_append + 1
sFilename = System.IO.Path.GetFileNameWithoutExtension(myFile.FileName) & file_append.ToString() + ".jpg"
End While
'Save the stream to disk
Dim newFile As System.IO.FileStream = New System.IO.FileStream(Server.MapPath(sSavePath + sFilename), System.IO.FileMode.Create)
newFile.Write(myData, 0, myData.Length)
newFile.Close()
' Check whether the file is really a JPEG by opening it
Try
' If jpg file is a jpeg, create a thumbnail filename that is unique.
file_append = 0
Dim sThumbFile As String = System.IO.Path.GetFileNameWithoutExtension(myFile.FileName) & sThumbExtension + ".jpg"
While System.IO.File.Exists(Server.MapPath(sSavePath + sThumbFile))
file_append = file_append + 1
sThumbFile = System.IO.Path.GetFileNameWithoutExtension(myFile.FileName) & file_append.ToString(+sThumbExtension + ".jpg")
End While
Dim ThumbnailCallback As System.Drawing.Image.GetThumbnailImageAbort
Dim myCallBack As System.Drawing.Image.GetThumbnailImageAbort
' Save thumbnail and output it onto the webpage
Dim mybitmap As Bitmap
mybitmap = New Bitmap(Server.MapPath(sSavePath + sFilename))
Dim mythumbnail As System.Drawing.Image
mythumbnail = mybitmap.GetThumbnailImage(intThumbWidth, intThumbHeight, myCallBack, IntPtr.Zero)
mythumbnail.Save(Server.MapPath(sSavePath + sThumbFile))
Imgpicture.ImageUrl = sSavePath + sThumbFile
' Displaying success information
lbloutput.Text = "File uploaded successfully!"
' Destroy objects
mythumbnail.Dispose()
mybitmap.Dispose()
Catch errArgument As ArgumentException
' The file wasn't a valid jpg file
lbloutput.Text = "The file wasn't a valid jpg file."
System.IO.File.Delete(Server.MapPath(sSavePath + sFilename))
End Try
End If
End Sub
|
|
|
|
|
Remeber to change the line containing the following:
Dim sThumbFile As String = System.IO.Path.GetFileNameWithoutExtension(myFile.FileName) & sThumbExtension + ".jpg"
to
Dim sThumbFile As String = System.IO.Path.GetFileNameWithoutExtension(sFilename) & sThumbExtension + ".jpg"
Otherwise it will fail if the thumbnail already exists
|
|
|
|
|
THANK YOU SO MUCH! I've been looking for working VB code of "uploading file" for a some time now. I almost gave up until saw this and thought "well ok, let's give this one a shot". And it was worth it. Finally can proceed with my work. Thanks again!
|
|
|
|
|
Thanks a million for this - been searching high and low for VB.Net code.
|
|
|
|
|
'Initialize variables
Dim sSavePath As String
Dim sThumbExtension As String
Dim intThumbWidth As Integer
Dim intThumbHeight As Integer
'Set constant values
sSavePath = "images/" & ddlSaveFolder.SelectedItem.Text & "/"
sThumbExtension = "_thumb"
intThumbWidth = 160
intThumbHeight = 120
'If file field isn’t empty
If IsNothing(filUpload.PostedFile) = False Then
'Check file size (mustn’t be 0)
Dim myFile As HttpPostedFile = filUpload.PostedFile
Dim nFileLen As Integer = myFile.ContentLength
If nFileLen = 0 Then
lblOutput.Text = "No file was uploaded."
Return
End If
'Check file extension (must be JPG)
If System.IO.Path.GetExtension(myFile.FileName).ToLower() <> ".jpg" Then
lblOutput.Text = "The file must have an extension of JPG"
Return
End If
'Read file into a data stream
Dim myData() As Byte = 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
Dim sFilename As String = System.IO.Path.GetFileName(myFile.FileName)
Dim file_append As Integer = 0
While System.IO.File.Exists(Server.MapPath(sSavePath + sFilename))
file_append = file_append + 1
sFilename = System.IO.Path.GetFileNameWithoutExtension(myFile.FileName) & file_append.ToString() + ".jpg"
End While
If HttpContext.Current.User.Identity.IsAuthenticated Then
'Save the stream to disk
Dim newFile As System.IO.FileStream = New System.IO.FileStream(Server.MapPath(sSavePath + sFilename), System.IO.FileMode.Create)
newFile.Write(myData, 0, myData.Length)
newFile.Close()
End If
|
|
|
|
|
Hi again
Why is the thumbnail saved as an .PNG file, while the bigger version of the file is an .JPG file?
|
|
|
|
|
Hi!
Why do I get the error: "File not a valid jpg file"?
When I run the script both files are save at the server, but I can't open the _thumb file neither in Photoshop or any other program.
Hope someone can help because it's a very cool script and I would really like it to work.
Larz
|
|
|
|
|
I had the same problem. It seems you need to tell .net the type of image file it is when you're saving the thumbnail. See code below:
//Put these classes at the tip of your class file
//I don't like writing these out all throughout the code
using System.Drawing;
using System.Drawing.Imaging;
using System.IO;
//Put this code at the top of the button click event
//initialize the type variable
ImageFormat imgFrmt = null;
//I replaced his check for a valid jpg with a check for gif, jpg or png
if (imgFile.ContentType != "image/pjpeg" && imgFile.ContentType != "image/gif" && imgFile.ContentType != "image/x-png")
{
lblOutput.Text = "The file must have an extension of JPG,GIF or PNG";
return;
}
//Put the code below in just before you try to save myThumbnail
//I added more code to his example to handle more image types so I have a
//switch to determine which format this file is in
//If you're only using one type, you could just initialize the variable
//above something like (ImageFormat imgFrmt = ImageFormat.Jpeg;)
switch(Convert.ToString(Path.GetExtension(imgFile.FileName)).ToLower())
{
case ".gif":
imgFrmt = ImageFormat.Gif;
break;
case ".jpeg":
case ".jpg":
imgFrmt = ImageFormat.Jpeg;
break;
case ".png":
imgFrmt = ImageFormat.Png;
break;
} //end switch
//Now when you use his code to save the image
//add the format parameter "imgFrmt" to it:
myThumbnail.Save (Server.MapPath(sSavePath + sThumbFile), imgFrmt);
Charles T.
|
|
|
|
|
Not sure if this is a useful shortcut, or if I'm going to cause myself a lot of hassle later, but I did the following:-
First, I checked the mime-type to ensure the file was a JPG/GIF/PNG - I figure this is more fool-proof than just checking the extension.
Then, instead of saving the file and then opening the file up into the bitmap, I read the InputStream directly into a new Bitmap:-
Bitmap objBitmap = new Bitmap(myFile.InputStream);
From here, I can check the dimensions of the image, determine if I need to create a thumbnail (or if the image is small enough to act as its own), etc. You can use Bitmap.Save(..) to store the image - if storing to a DB Blob, I'm guessing you could either Read the Stream first into a Byte[] array, or write the Bitmap into the Blob.
So far, I haven't had any problems with this, but if there is something I've missed I'm sure one of you will know.
Two areas I'll like to sort out:-
A) Is there a better way to generate a unique filename? (they don't have to be user-friendly, since the user-friendly name is stored in the database, with its associated unique filename)
B) when sending the image back to the browser (I'm using a GetImage.aspx?user=2&img=3 setup), can I attach the user-friendly name to the image - for example if they right-click and Save Picture As... the filename in the 'Save As' dialog would be the user-friendly name stored in the database.
Yours,
Ann-Marie Ratcliffe
|
|
|
|
|
Is there any article on retrieving files from database where user had uploaded earlier?
|
|
|
|
|
Introduction
This article describes how to upload images to a web server using ASP.NET. All the data is stored in a MySQL database. This article is targeted towards a little more intermediate programmer who has some understanding of ASP.NET with C#, SQL and relational databases. First section describes how to set up the database and second part describes how to code uploading the files and how to view them back as a gallery. Code has been tested with JPEG and GIF files.
Setting Up the Database
The database that I have used is MySQL. Information on how to obtain and install MySQL can be obtained from here. To make the process of creation and interacting with the database, I used MySQL control center. This allows a visual way for creating and interacting with a MySQL database.
MySQL comes with a default database called test. And I will be using this database.
The next thing is to create a table called file with the following columns.
ID – Select it to be a timestamp to create it as the primary key of the table.
Extension – Select it as varchar.
Data – Select it as longblob.
To connect to the MySQL database, MySQL ODBC driver has to be downloaded. The version of MySQL ODBC driver is 3.51 that I have used for this article. All the code to interact with database is placed in a DataAccess class.
public class DataAccess
{
private string _strConn =
@"Driver= {MySQLODBC 3.51 Driver};SERVER=localhost;DATABASE=test;";
private OdbcConnection _objConn;
public DataAccess()
{
this._objConn = new OdbcConnection(this._strConn);
}
// This function adds the Images to database
public string addImage(byte [] buffer,string extension)
{
string strSql = "SELECT * FROM File";
DataSet ds = new DataSet("Image");
OdbcDataAdapter tempAP = new OdbcDataAdapter(strSql,this._objConn);
OdbcCommandBuilder objCommand = new OdbcCommandBuilder(tempAP);
tempAP.Fill(ds,"Table");
try
{
this._objConn.Open();
DataRow objNewRow = ds.Tables["Table"].NewRow();
objNewRow["Extension"] = extension;
objNewRow["Data"] = buffer;
ds.Tables["Table"].Rows.Add(objNewRow);
// trying to update the table to add the image
tempAP.Update(ds,"Table");
}
catch(Exception e){return e.Message;}
finally{this._objConn.Close();}
return null;
}
// This function to get the image data from the database
public byte [] getImage(int imageNumber)
{
string strSql = "SELECT * FROM File";
DataSet ds = new DataSet("Image");
OdbcDataAdapter tempAP = new OdbcDataAdapter(strSql,this._objConn);
OdbcCommandBuilder objCommand = new OdbcCommandBuilder(tempAP);
tempAP.Fill(ds,"Table");
try
{
this._objConn.Open();
byte [] buffer = (byte [])ds.Tables["Table"].Rows[imageNumber]["Data"];
return buffer;
}
catch{this._objConn.Close();return null;}
finally{this._objConn.Close();}
}
// Get the image count
public int getCount()
{
string strSql = "SELECT COUNT(Data) FROM File";
DataSet ds = new DataSet("Image");
OdbcDataAdapter tempAP = new OdbcDataAdapter(strSql,this._objConn);
OdbcCommandBuilder objCommand = new OdbcCommandBuilder(tempAP);
tempAP.Fill(ds,"Table");
try>
{
this._objConn.Open();
int count = (int)ds.Tables["Table"].Rows[0][0];
return count;
}
catch{this._objConn.Close();return 0;}
finally{this._objConn.Close();}
}
}
Getting the User Uploaded files
To upload the files to the web server, a very simple ASP.NET web form is used, which is composed of a file field and a submit button. The Web form file in the project is Upload.aspx and the code is place in Upload.aspx.cs. The file is obtained and put in the database in the Page_Load function. Now the code takes a look into the Request.Files collection. As the interface allows to upload only one file, therefore, we check it if there is a file pending on IIS. The code checks for the mime type of the file if it is an image it accepts, otherwise it just displays a message that mime type is not supported. If the file is an image, data is read in bytes and inserted into the MySQL database using the DataAccess class object.
private void Page_Load(object sender, System.EventArgs e)
{
//Checking if there are any files avaiable on IIS.
if(Request.Files.Count != 0)
{
HttpPostedFile httpFile = Request.Files[0];
// Checking for extension
string extension = this.getFileExtension(httpFile.ContentType);
if(extension == null )
{
Response.Write("Mime type not Supported");
return;
}
System.IO.BufferedStream bf = new BufferedStream(httpFile.InputStream);
byte[] buffer = new byte[bf.Length];
bf.Read(buffer,0,buffer.Length);
// Creating the database object
DataAccess data = new DataAccess();
// Adding files to the database.
data.addImage(buffer,extension);
Response.Write("Image Added!");
}
}
Displaying Upload File
Now, to display the uploaded files for the user, another Web form is setup in a file called View.aspx. Getting the image data is done by another file called show.aspx.
private void Page_Load(object sender, System.EventArgs e)
{
// Put user code to initialize the page here
Data.DataAccess data = new Data.DataAccess();
int imagenumber = 0;
try
{
imagenumber = int.Parse(Request.QueryString["image"]);
}
catch(System.ArgumentNullException ee)
{
imagenumber = 0;
}
byte [] buffer = data.getImage(imagenumber);
System.IO.MemoryStream stream1 = new System.IO.MemoryStream(buffer,true);
stream1.Write(buffer,0,buffer.Length);
Bitmap m_bitmap = (Bitmap) Bitmap.FromStream(stream1,true);
Response.ContentType = "Image/jpeg";
m_bitmap.Save(Response.OutputStream,System.Drawing.Imaging.ImageFormat.Jpeg);
}
View.aspx allows the user to go to the next file by clicking next link.
hello...This is sandeep vyas, software developer in pune and i wanna join code project
|
|
|
|
|
I m using the Microsoft ASP.NET Web Matrix right now doing the uploading codes, but seeme like i can't get it done easily.
I encountered the followings problem:
1) i follow the steps and paste in the whole codes, the error message that turns back is
Description: An error occurred during the compilation of a resource required to service this request. Please review the following specific error details and modify your source code appropriately.
Compiler Error Message: BC30205: End of statement expected.
Source Error:
Line 2:
Line 3:
Line 4: private void btnUpload_Click(object sender, System.EventArgs e)
Line 5: {
Line 6: // Initialize variables
The line4 is the problem, it needs a end statement... I juz started to learn programming and asp.net recently so i really don't what to do.
Please help !!!
How shall the whole codings look like after the whole thing is fix generally? I really like to take a look.
Don't Worry, Be Happy !!!
|
|
|
|
|
Try editing Line 2 to:-
<script language="c#" runat="server">
I think its trying to read the script as VB.NET.
HTH,
Ann-Marie Ratcliffe
|
|
|
|
|
Hi,
According to this example it will stored the both thumbnail image and original image that is posted from client mechine .
but i don't want to save the original image that is posted from the client mechine into server, what i want is to save only the thumbnail image insted of original image file.can any one help me regarding this issue
|
|
|
|
|
Nice article only if you want a file to upload wich aint a jpg you can just change the extention to jpg and it will upload.
Better method is to check on ContentType. So it would be:
if(Upload.PostedFile.ContentType == "image/pjpeg")
some contenttypes:
jpg = image/pjpeg
gif = image/gif
png = image/x-png
|
|
|
|
|
I think using htmlInputFile is simpler :
But i don't know how i can upload a file in my code only without add a htmlInputFile control to my Webform. Help me !
The following example demonstrates how to use the PostedFile property to initiate the utility that transfers the file to the server.
[Visual Basic]
<%@ Page Language="VB" AutoEventWireup="True" %>
Sub Button1_Click(Source As Object, e As EventArgs)
If Text1.Value = "" Then
Span1.InnerHtml = "Error: you must enter a file name"
Return
End If
If Not (File1.PostedFile Is Nothing) Then
Try
File1.PostedFile.SaveAs(("c:\temp\" & Text1.Value))
Span1.InnerHtml = "File uploaded successfully to <b>c:\temp\" & _
Text1.Value & "</b> on the Web server"
Catch exc As Exception
Span1.InnerHtml = "Error saving file <b>c:\temp\" & _
Text1.Value & "</b><br>" & exc.ToString()
End Try
End If
End Sub 'Button1_Click
HtmlInputFile Sample
Select File to Upload:
Save as filename (no path):
[C#]
<%@ Page Language="C#" AutoEventWireup="True" %>
void Button1_Click(object Source, EventArgs e)
{
if (Text1.Value == "")
{
Span1.InnerHtml = "Error: you must enter a file name";
return;
}
if (File1.PostedFile != null)
{
try
{
File1.PostedFile.SaveAs("c:\\temp\\"+Text1.Value);
Span1.InnerHtml = "File uploaded successfully to <b>c:\\temp\\" +
Text1.Value + "</b> on the Web server";
}
catch (Exception exc)
{
Span1.InnerHtml = "Error saving file <b>c:\\temp\\" +
Text1.Value + "</b><br>" + exc.ToString();
}
}
}
HtmlInputFile Sample
Select File to Upload:
Save as filename (no path):
cuonglt
|
|
|
|
|
How can I overcome this problem??
I'm using WinXP,IIS 5.0, .NET 2002
10x
Yariv.
|
|
|
|
|
I also have this problem.
Has anyone seen it? How did you solve it?
Thanks.
|
|
|
|
|
Hi, I had this problem too. The solution that worked for me was giving the guest internet account full access to the folder, you should be OK with this as long as you make sure people are just uploading JPEGs! Right click on the folder in question, select Properties and you get this dialog ...
these are the output images from the script ... php doesn't like the thumbnails for some reason :-/
http://yay.realmaracuja.com/index.php?filePath=/My%20DotNet%20Uploader%20Test/
|
|
|
|
|
HI!
even i am getting the same problem,pls could u explain what do u mean by full access and how to change these properties.
SAM
|
|
|
|