2012-06-06 147 views
3

我想在我的web應用中使用vaadin上傳組件,並直接上傳文件到mfs格式的mongo數據庫。Vaadin上傳組件 - 直接上傳到mongo倉庫

我目前的實現使用臨時存儲位置首先上傳文件,然後存儲在mongo中轉換爲gridfs。

這裏是我的上傳組件的代碼:我實現接收器接口方法recieveUpload

private File file; 
private String tempFilePath; 

public class HandleUploadImpl extends CustomComponent 
     implements Upload.SucceededListener, 
     Upload.FailedListener, 
     Upload.ProgressListener, 
     Upload.Receiver { ........ 

    public OutputStream receiveUpload(String filename, String MIMEType) { 
      logger.debug("File information {} {}", filename, MIMEType); 


      this.filename = filename; 
      FileOutputStream fos; 

      file = new File(tempFilePath + filename); 

      try { 
       fos = new FileOutputStream(file); 
      } catch (final java.io.FileNotFoundException e) { 
       logger.error("Error occurred while opening the file {}", e); 
       return null; 
      } 

      return fos; 
     } 

這裏是我的代碼在蒙戈庫

private void saveBuildFile(Map<String, Object> buildFileInfo, String key) { 
     if (buildFileInfo.containsKey(key)) { 
      GridFS gridFS = new GridFS(mongoTemplate.getDb(), COLLECTION_NAME); 
      File file = (File) buildFileInfo.get(key); 
      buildFileInfo.remove(key); 

      try { 
       GridFSInputFile savedFile = gridFS.createFile(file); 
       savedFile.put(idK, buildFileInfo.get(key + "-id")); 
       savedFile.save(); 
      } catch (Exception e) { 
       logger.error("Something went wrong when saving the file in the db {}", e); 
      } 
     } 
    } 

存儲有沒有一種方法我可以不使用臨時存儲並將上傳組件的輸出流設置爲mongo存儲庫gridfs文件。

+0

爲什麼你不能使用代碼在_saveBuildFile_並做到這一點的方法receiveUpload? receiveUpload只需要在它將要寫入的文件上返回一個OutputStream。我認爲你可以做到這一點。 – sergiofbsilva

回答

1

這個工作對我來說:

package ch.domain.vaadin; 

import ch.domain.vaadin.mongo.MongoItem; 
import com.mongodb.BasicDBObject; 
import com.mongodb.DB; 
import com.mongodb.gridfs.GridFS; 
import com.mongodb.gridfs.GridFSInputFile; 
import com.vaadin.data.fieldgroup.FieldGroup; 
import com.vaadin.ui.Upload.Receiver; 
import com.vaadin.ui.Upload.SucceededEvent; 
import com.vaadin.ui.Upload.SucceededListener; 
import java.io.ByteArrayOutputStream; 
import java.io.OutputStream; 

/** 
* 
* @author eric 
*/ 
class ImageUploader implements Receiver, SucceededListener { 
    private String filename; 
    private DB db; 
    private ByteArrayOutputStream fos; 
    private FieldGroup fieldGroup; 


    public void setFieldGroup(FieldGroup fieldGroup) { 
     this.fieldGroup = fieldGroup; 
    } 


    public ImageUploader(DB db) 
    { 
     this.db = db; 
    } 

    public OutputStream receiveUpload(String filename, 
             String mimeType) { 
     // Create upload stream 
     this.fos = new ByteArrayOutputStream(); 
     this.filename = filename; 

     return this.fos; // Return the output stream to write to 
    } 

    public void uploadSucceeded(SucceededEvent event) { 
     GridFS gfsPhoto = new GridFS(db, "photo"); 
     GridFSInputFile gfsFile = gfsPhoto.createFile(this.fos.toByteArray()); 
     MongoItem parentId = (MongoItem) fieldGroup.getItemDataSource(); 
     gfsFile.setMetaData(new BasicDBObject().append("parentId", parentId.getItemProperty("_id").getValue().toString())); 
     gfsFile.setFilename(this.filename); 
     gfsFile.save(); 
     this.fos = null; 
     gfsFile = null; 
     // Show the uploaded file in the image viewer 
     // image.setVisible(true); 
     // image.setSource(new FileResource(file)); 
    } 
}