Ronsen's Blog

Bagaimana Mengunggah File di GAE Menggunakan Play Framework

Sunday, February 27, 2011

Menggunakan Play Framework untuk membangun aplikasi di Google App Engine sangatlah menyenangkan. Karena menggunakan framework tersebut sangat mudah dan didukung oleh editor seperti Eclipse dan NetBeans. Untuk bahasan saat ini, saya menggunakan modul GAE dan Siena untuk persistence-nya.

Sayangnya Google App Engine tidak memperbolehkan menggunakan java.io.File di layanannya sehinggga untuk mengunggah (upload) sebuah berkas (file) agak sedikit berbeda tetapi malah jauh lebih sederhana. Karena berkas-berkas tersebut tidak bisa disimpan di file system App Engine, maka harus disimpan dalam bentuk tipe blob di dalam datastore. Jadi bagimana caranya meng-upload contohnya saja sebuah gambar di aplikasi GAE? Berikut caranya.


Buatlah sebuah kelas model dengan nama Photo.
 public class Photo extends Model {          
      @Id(Generator.AUTO_INCREMENT)  
      public Long id;  
        
      public String title;          
      public Blob image;  
        
      public Photo() {  
      }
        
      static Query<Photo> all() {  
           return Model.all(Photo.class);  
      }  
        
      public static Photo findById(long id) {  
           return all().filter("id", id).get();  
      }          
 }

Buatlah sebuah form pada halaman HTML supaya pengguna dapat meng-upload gambarnya:
 #{form @upload(), method:'POST', enctype:'multipart/form-data'}  
 <p>Title<br>  
 <input type="text" name="title" size="50"/></p>  
   
 <p>Image<br>  
 <input type="file" name="image"/></p>  
 <p><input type="submit" value="Upload"/></p>  
 #{/form}  

Selanjutnya untuk proses upload di controller:
 public static void upload(String title, byte[] image) {  
      /* Convert byte array to blob */  
      Blob blob = new Blob(image);  
   
      /* Save */  
      Photo photo = new Photo();  
      photo.title = title;  
      photo.image = blob;  
      photo.insert();  
   
      flash.success("File successfully uploaded.");  
        
      /* Redirect to index page */  
      index();  
 }

Karena contoh ini berhubungan dengan gambar, maka untuk menampilkan hasilnya tambahkan perintah berikut di controller:
 public static void view(long id) {  
      Photo photo = Photo.findById(id);  
      Blob blob = photo.image;  
      InputStream is = new ByteArrayInputStream(blob.getBytes());  
      renderBinary(is);  
 }

dan untuk view-nya:
 <img src="@{Application.view(photo.id)}">  

Jadinya lebih mudah, kan!