Ahmad Masykur

Share your knowledge although one function!

About the author

Ahmad Masykur is a Software Architecture Engineer at PT. Freeport Indonesia Jakarta Indonesia.
In this blog, I share things of interest to me. Most topics are likely to be related to software development, but don't hold me to it.

Certificates



Awards


Powered by

Widget Prayer Time not found.

There is an error in XML document (4, 16278).X

Page List

Validators


Ahmad Masykur

Membuat HttpHandler untuk Resize Image

Ketika membuat sebuah galeri foto, sering kali harus membuat beberapa versi ukuran foto. Foto-foto kecil ditampilkan secara berjajar. Ketika foto diklik, akan muncul foto dengan ukuran besar. Pada waktu slide-show, maka foto ukuran sedang yang ditampilkan. Untuk membuat foto dengan ukuran yang bermacam-macam dapat dilakukan dengan merubah ukuran secara run-time.

Berikut adalah class untuk melakukan resize ukuran image.

public class PhotoManager {
    public static byte[] ResizeImageFile(byte[] imageFile, int targetSize) {
        using (System.Drawing.Image oldImage = System.Drawing.Image.FromStream(new MemoryStream(imageFile))) {
            Size newSize = CalculateDimensions(oldImage.Size, targetSize);
            using (Bitmap newImage = new Bitmap(newSize.Width, newSize.Height, PixelFormat.Format24bppRgb)) {
                using (Graphics canvas = Graphics.FromImage(newImage)) {
                    canvas.SmoothingMode = SmoothingMode.AntiAlias;
                    canvas.InterpolationMode = InterpolationMode.HighQualityBicubic;
                    canvas.PixelOffsetMode = PixelOffsetMode.HighQuality;
                    canvas.DrawImage(oldImage, new Rectangle(new Point(0, 0), newSize));
                    MemoryStream m = new MemoryStream();
                    newImage.Save(m, ImageFormat.Jpeg);
                    return m.GetBuffer();
                }
            }
        }
    }

    private static Size CalculateDimensions(Size oldSize, int targetSize) {
        Size newSize = new Size();
        if (oldSize.Height > oldSize.Width) {
            newSize.Width = (int)(oldSize.Width * ((float)targetSize / (float)oldSize.Height));
            newSize.Height = targetSize;
        } else {
            newSize.Width = targetSize;
            newSize.Height = (int)(oldSize.Height * ((float)targetSize / (float)oldSize.Width));
        }
        return newSize;
    }
}

Dalam kode di atas, targetSize merupakan target panjang image yang akan diperoleh. Untuk mengirimkan gambar ke client, dibutuhkan sebuah handler.

Berikut adalah handler mengirimkan image ke client. Kode dibawah disimpan dalam file dengan extention .ashx yang akan dikerjakan oleh web server sebagai sebuah web handler.

<%@ WebHandler Language="C#" Class="Handler" %>

using System;
using System.IO;
using System.Web;

public class Handler : IHttpHandler {

	public bool IsReusable {
		get {
			return true;
		}
	}
	
	public void ProcessRequest (HttpContext context) {
		// Set up the response settings
		context.Response.ContentType = "image/jpeg";
		context.Response.Cache.SetCacheability(HttpCacheability.Public);
		context.Response.BufferOutput = false;
		// Get photo from file system
        string filename = context.Request.QueryString("FileName");
        if (filename != null)
        {
            using (FileStream fileStream = new FileStream(context.Server.MapPath("images\\" + filename)))
            {
                using (BinaryReader reader = new BinaryReader(fileStream))
                {
                    byte[] imageFile = reader.ReadBytes(fileStream.Length);
                    byte[] stream;
                    stream = (context.Request.QueryString("Size") != null) ? PhotoManager.ResizeImageFile(imageFile, int.Parse(context.Request.QueryString("Size"))) : imageFile;
                    // Write image stream to the response stream
                    const int buffersize = 1024 * 16;
                    byte[] buffer = new byte[buffersize];
                    int count = stream.Read(buffer, 0, buffersize);
                    while (count > 0)
                    {
                        context.Response.OutputStream.Write(buffer, 0, count);
                        count = stream.Read(buffer, 0, buffersize);
                    }
                }
            }
        }
    }
}

Pada halaman web tinggal panggil handler yang telah dibuat dengan querystring nama file dan ukuran image.

<img src="Handler.ashx?FileName=myimage.jpg&Size=320"style="border:4px solid white" alt="My Image" />

Categories: ASP.NET
Permalink | Comments (9) | Post RSSRSS comment feed

Menulis Alamat Email yang Aman dari Spam

Spam adalah penyalahgunaan dalam penampilan berita elektronik untuk pengiriman berita iklan dan keperluan lainnya yang mengakibatkan ketidaknyamanan bagi para pengguna web (http://id.wikipedia.org/wiki/Spam). Sering kali kita mendapatkan email spam.

Dari mana email spam itu berasal? Bagaimana si pengirim spam mengetahui alamat email kita? Ada banyak cara yang dapat dilakukan oleh pengirim email spam untuk mendapatkan alamat email. Salah satu cara yang banyak digunakan adalah dengan mencari pola email dari halaman-halaman yang dipublikasikan. Pola emal sangat unik yaitu nama@domain sehingga dengan mudah dikenali bahwa itu adalah alamat email. Dengan menggunakan robot untuk membaca halaman-halaman web yang saling berkaitan, digunakan regular expression sederhana maka semua alamat email dalam satu halaman dapat diambil oleh si pengirim spam.

Untuk menanggulangi pembacaan alamat email oleh spam dapat dilakukan dengan berbagai cara, salah satu cara adalah dengan mengubah tulisan yang masih bisa dipahami oleh manusia tapi tidak terbaca oleh robot. Perubahan tulisan yang umum digunakan adalah emailku@domainku.web.id ditulis menjadi:

  • emailku[at]domainku[dot]web[dot]id
  • emailkuNOSPAM@domainku.web.id (dengan menambahkan keterangan "hilangkan NOSPAM")
  • emailku^at^domainku.web.id
  • dan lain sebagainya.

Dengan merubah penamaan alamat email, minimal mengurangi jumlah robot yang bisa membaca alamat email yang dipublikasikan tersebut. Namun robot yang lebih cerdas juga dapat membaca pola-pola yang umum tersebut. Salah satu trik untuk melindungi publikasi alamat email dari spam robot adalah menggunakan Javascript karena biasanya robot sangat sulit untuk menterjemahkan Javascript.

// Opens the caller's default e-mail client
// with the subject filled if specified.
function SafeMail(name, domain, subject)
{
  if (subject != null)
    subject = "?subject=" + subject;
  location.href="mailto:" + name + "@" + domain + subject;
}

Script di atas sebenarnya hanya untuk menyembunyikan pola penulisan mailto:nama@domain dengan sebuah fungsi Javascript. Fungsi tersebut digunakan untuk menggabungkan potongan-potongan pola email menjadi pola email yang sebenarnya.

Berikut contoh penulisan pada halaman html untuk menyembunyikan pola email dengan fungsi di atas.

<h1>About the author</h1> 
<div class="vcard">
<span class="fn">Ahmad Masykur</span> is a software developer at <a href="http://www.bataviasoft.com/">
<span class="org">Bataviasoft</span></a> 
<span class="adr"><span class="locality">Jakarta</span> 
<span class="country-name">Indonesia</span></span>.
</div> 
<!-- Email -->
<div style="float:right;">
<a href="javascript:SafeMail('ahmad', 'masykur.web.id', 'Menulis Alamat Email yang Aman dari Spam')">E-mail me</a>
</div>

Dengan cara tersebut, yang ditampilkan di halaman hanyalah tulisan E-mail me. Pada waktu link di-klik, otomatis akan membuka email-client yang telah tersisi alamat email dan subject.


Categories: ASP.NET
Permalink | Comments (4) | Post RSSRSS comment feed

Upload dan Download File

Upload file di ASP.NET dapat menggunakan ASP.NET Web Control FileUpload. Untuk implementasi upload tinggal pasang control FileUpload dan satu Button.

<asp:FileUpload ID="fileUpload" runat="server" Width="300" />
<asp:Button id="btnUpload" runat="server" Text="Upload" />

Pada codebehind, buat handler untuk btnUpload.Click

Private Sub btnUpdate_Click(ByVal sender As Object, ByVal e As EventArgs) Handles btnUpdate.Click
    Try
        Dim objFile As FileInfo = New FileInfo

        If fileUpload.PostedFile Is Nothing Then
            Exit Sub
        End If
        If Not fileUpload.HasFile Then
            Exit Sub
        End If

        Dim path As String = Me.MapPath("files/")
        path = path.Replace("/", "\")
        If Not Directory.Exists(path) Then
            Directory.CreateDirectory(path)
        End If
        fileUpload.SaveAs(path + fileUpload.PostedFile.FileName)

    Catch exc As Exception    
        'Exception code here
    End Try
End Sub

Untuk download file, kita bisa menggunakan Response untuk mengirimkan data ke client. Misalkan ada sebuat tombol untuk download, handler tombol tersebut dapat ditulis sebagai berikut.

Dim path As String = Me.MapPath("files/")
path = path.Replace("/", "\")
Dim namafile As String = "namafile.ext"
Response.Clear()    'Bersihkan buffer stream
'Tambahkan header namafile
Response.AppendHeader("content-disposition", "attachment; filename=" + namafile)
Response.WriteFile(path + namafile)
Response.End()
Response.Close()

Jika file yang diupload perlu diolah terlebih dahulu atau disimpan dalam database, maka file tersebut dapat dibaca menggunakan BinaryReader. Berikut contoh sederhana untuk melakukan enkripsi sebelum file disimpan di filesystem atau database.

Private Sub btnUpdate_Click(ByVal sender As Object, ByVal e As EventArgs) Handles btnUpdate.Click
    Try
        Dim objFile As FileInfo = New FileInfo

        If fileUpload.PostedFile Is Nothing Then
            Exit Sub
        End If
        If Not fileUpload.HasFile Then
            Exit Sub
        End If

        Dim path As String = Me.MapPath("files/")
        path = path.Replace("/", "\")
        If Not Directory.Exists(path) Then
            Directory.CreateDirectory(path)
        End If
        Dim uploadedStream As New BinaryReader(fileUpload.PostedFile.InputStream)
	  Dim bytesStream As Byte() = uploadedStream.ReadBytes(fileUpload.PostedFile.ContentLength)
        'Tutup stream
        uploadedStream.Close()
        'Panggil fungsi enkripsi (contoh)
        Dim cipherStream As Byte() = Encrypt(bytesStream)
        'Simpan hasil enkripsi dalam filesystem
        Using _fileStream As New FileStream(path + fileUpload.FileName, FileMode.Create, FileAccess.Write)
            _fileStream.Write(cipherStream, 0, cipherStream.Length)
            _fileStream.Flush()
            _fileStream.Close()
        End Using
    Catch exc As Exception    
        'Exception code here
    End Try
End Sub

Jika file telah dienkripsi, maka pada waktu download file tersebut juga harus didekripsi sebelum dikirimkan ke client.

path = path.Replace("/", "\") 
Dim namafile As String = "namafile.ext" 
'Buka stream
Dim _fileStream As New FileStream(path + namafile, FileMode.Open, FileAccess.Read)
Dim _binReader As New BinaryReader(_fileStream)
Dim _cipherStream As Byte() = _binReader.ReadBytes(_fileStream.Length)
_binReader.Close()
_fileStream.Close()
'Panggil fungsi dekripsi (contoh)
Dim _plainStream As Byte() = Decrypt(_cipherStream)
'Kirim stream ke client
Response.Clear() 'Bersihkan buffer stream 
'Tambahkan header namafile 
Response.AppendHeader("content-disposition", "attachment; filename=" + namafile) 
Response.BinaryWrite(plainStream)
Response.Flush()
Response.End() 
Response.Close()

Semoga bermanfaat


Categories: ASP.NET
Permalink | Comments (9) | Post RSSRSS comment feed