ASP.net: Upload Dan Download FILESTREAM

FILESTREAM merupakan fitur baru di SQL server 2008 yang mengintegrasikan database dengan file system NTFS. Untuk menyimpan data FILESTREAM, kolom di definisikan dengan tipe Varbinary (max). Disini saya tidak menulis bagaimana membuat/mensetting database untuk FILESTREAM, karena saya sendiri tidak terlalu menguasainya. Di projek terakhir, teman di bagian database yang membuat settingannya. Jadi saya hanya menulis bagaimana menyimpan dan mengakses data FILESTREAM.

Di database, tabel dibuat seperti berikut

Di sisi aplikasi, contoh desain antarmuka seperti berikut, saya menggunakan FileUpload, ImageButton untuk upload, gridview untuk menampilkan daftar file yang tersimpan di database dan ImageButton untuk download file.

UPLOAD FILE KE DATABASE
File di upload menggunakan tool FileUpload, kemudian tekan tombol upload, untuk melakukan proses upload file ke database.
Pertama buat store procedure di SQL Server untuk menyimpan file yang di upload

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

CREATE PROCEDURE [dbo].[sp_add_File]
@FileName varchar(50),
@FileType varchar(5),
@filepath varchar(max) output,
@IdCategory int
AS
BEGIN
	SET NOCOUNT ON;

    DECLARE @ID UNIQUEIDENTIFIER
	SET @ID = NEWID()

	INSERT INTO [dbo].tbl_Files
	([Id], FileName, SystemFile, FileType, IdCategory, created_date)
	VALUES (@ID ,@FileName, CAST('' AS VARBINARY(MAX)),@FileType, @IdCategory, GETDATE())
	
	select @filepath = SystemFile.PathName() from tbl_Files where Id = @ID
END

Buka file codebehind, dan buat prosedur berikut di button upload

Protected Sub Upload(ByVal sender As Object, ByVal e As System.Web.UI.ImageClickEventArgs) Handles ImageButton1.Click
	Dim buffer As Byte() = New Byte(CInt(FileUpload1.FileContent.Length) - 1) {}
	FileUpload1.FileContent.Read(buffer, 0, buffer.Length)

	If FileUpload1.FileContent.Length > 0 Then
		Dim objSqlCon As New SqlConnection(ConfigurationManager.ConnectionStrings("ConnectionString").ConnectionString)

		objSqlCon.Open()
		Dim objSqlTran As SqlTransaction = objSqlCon.BeginTransaction()

		Dim objSqlCmd As New SqlCommand("sp_add_File", objSqlCon, objSqlTran)
		objSqlCmd.CommandType = CommandType.StoredProcedure

		Dim objSqlParam1 As New SqlParameter("@IdCategory", SqlDbType.Int)
		objSqlParam1.Value = IdCategory

		Dim objSqlParam2 As New SqlParameter("@FileType", SqlDbType.VarChar, 4)
		objSqlParam2.Value = System.IO.Path.GetExtension(FileUpload1.FileName)

		Dim objSqlParam3 As New SqlParameter("@FileName", SqlDbType.VarChar)
		objSqlParam3.Value = FileUpload1.FileName.ToString

		Dim objSqlParamOutput As New SqlParameter("@filepath", SqlDbType.VarChar, -1)
		objSqlParamOutput.Direction = ParameterDirection.Output

		objSqlCmd.Parameters.Add(objSqlParam3)
		objSqlCmd.Parameters.Add(objSqlParam2)
		objSqlCmd.Parameters.Add(objSqlParam1)
		objSqlCmd.Parameters.Add(objSqlParamOutput)

		objSqlCmd.ExecuteNonQuery()

		Dim Path As String = objSqlCmd.Parameters("@filepath").Value.ToString()

		objSqlCmd = New SqlCommand("SELECT GET_FILESTREAM_TRANSACTION_CONTEXT()", objSqlCon, objSqlTran)
		Dim objContext As Byte() = DirectCast(objSqlCmd.ExecuteScalar(), Byte())

		Dim objSqlFileStream As New SqlFileStream(Path, objContext, FileAccess.Write)

		objSqlFileStream.Write(buffer, 0, buffer.Length)
		objSqlFileStream.Close()

		objSqlTran.Commit()
		objSqlCon.Close()
	End If
	'BindData()  ---> tampilkan daftar file yang telah di upload ke gridview
End Sub

File yang berhasil di upload bisa di cek di database, hasilnya kurang lebih seperti berikut

DOWNLOAD FILE
Sekarang bagaimana cara mengambil file yang telah tersimpan di database?
Pertama buat dulu storeprocedure untuk mengambil file dari database.

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

CREATE PROCEDURE [dbo].[sp_get_File]
@Id varchar(50)
AS
BEGIN
	SET NOCOUNT ON;

	select  SystemFile.PathName(),FileType from tbl_Files where Id = @ID
END

Buat procedur untuk mengambil file. Berikut contoh method untuk download file dari database.

Protected Sub GetFile(ByVal id As String)
	Dim objSqlCon As New SqlConnection(ConfigurationManager.ConnectionStrings("ConnectionString").ConnectionString)

	objSqlCon.Open()
	Dim objSqlTran As SqlTransaction = objSqlCon.BeginTransaction()

	Dim objSqlCmd As New SqlCommand("sp_get_materi", objSqlCon, objSqlTran)
	objSqlCmd.CommandType = CommandType.StoredProcedure

	Dim objSqlParam1 As New SqlParameter("@Id", SqlDbType.VarChar)
	objSqlParam1.Value = id

	objSqlCmd.Parameters.Add(objSqlParam1)

	Dim path As String = String.Empty
	Dim fileType As String = String.Empty

	Using Reader = objSqlCmd.ExecuteReader
		While Reader.Read
			path = Reader.GetValue(0).ToString
			fileType = Reader.GetValue(1).ToString
		End While
	End Using

	objSqlCmd = New SqlCommand("SELECT GET_FILESTREAM_TRANSACTION_CONTEXT()", objSqlCon, objSqlTran)
	Dim objContext As Byte() = DirectCast(objSqlCmd.ExecuteScalar(), Byte())

	Dim objSqlFileStream As New SqlFileStream(path, objContext, FileAccess.Read)
	Dim buffer As Byte() = New Byte(CInt(objSqlFileStream.Length) - 1) {}
	objSqlFileStream.Read(buffer, 0, buffer.Length)
	objSqlFileStream.Close()

	objSqlTran.Commit()

	Response.AddHeader("Content-disposition", "attachment; filename=" & SharedFunctions.GetFileName(path) & fileType)
	Response.ContentType = "application/octet-stream"
	Response.BinaryWrite(buffer)
	objSqlCon.Close()
End Sub

Prosedur diatas, akan mengambil file sesuai dengan nomor id nya. File yang di download dapat langsung di buka

Happy coding

Credit buat Boedyst,

About Yuniar

Penulis sekarang lebih banyak bekerja menggunakan teknologi Microsoft .NET secara umum dan TIDAK lagi menggunakan aplikasi MapXtreme.net dari MapInfo. Karena itu mohon maaf, jika pertanyaan-pertanyaan mengenai MapXtreme sudah tidak bisa saya jawab lagi.

Posted on 10 Mei 2010, in ADO.net, ASP.net and tagged , , , , , . Bookmark the permalink. Tinggalkan komentar.

Tinggalkan Balasan

Isikan data di bawah atau klik salah satu ikon untuk log in:

Logo WordPress.com

You are commenting using your WordPress.com account. Logout / Ubah )

Gambar Twitter

You are commenting using your Twitter account. Logout / Ubah )

Foto Facebook

You are commenting using your Facebook account. Logout / Ubah )

Foto Google+

You are commenting using your Google+ account. Logout / Ubah )

Connecting to %s

%d blogger menyukai ini: