Vaadin Upload компонент - директно качване в mongo хранилище

Искам да използвам компонент за качване на vaadin в моето уеб приложение и директно да качвам файлове в mongo db във формат gridfs.

Текущата ми реализация използва място за временно съхранение, за да качи първо файл и след това да го съхрани в 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;
        }

Ето моя код за съхранение в хранилището на mongo

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);
            }
        }
    }

Има ли начин да пропусна използването на временно хранилище и да задам изходния поток на компонента за качване към gridfs файла на хранилището на mongo.


person Isuru    schedule 06.06.2012    source източник
comment
Защо не можете да използвате кода в saveBuildFile и да го направите в метода receiveUpload? receiveUpload просто трябва да върне OutputStream върху файла, където ще пише. Мисля, че можеш да се справиш.   -  person sergiofbsilva    schedule 08.06.2012


Отговори (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));
    }
}
person ericg    schedule 07.12.2014