Play framework CRUD загрузка файлов - PullRequest
1 голос
/ 07 декабря 2011

Кто-нибудь знает, как добавить файл загрузки в форму CRUD Play? Пока у меня есть часть вида, как это:

   #{form action:@save(object._key()), enctype:'multipart/form-data'}
    #{crud.form}
        #{crud.custom 'file'}
            <label for="uploadFile">
                File
            </label>
            <input type="file" id="uploadFile" name="uploadFile" />
        #{/crud.custom}
    #{/crud.form}
    <p class="crudButtons">
        <input type="submit" name="_save" value="&{'crud.save', type.modelName}" />
        <input type="submit" name="_saveAndContinue" value="&{'crud.saveAndContinue', type.modelName}" />
    </p>
#{/form}

Но я не знаю, как написать метод контроллера для обработки загрузки. И я не хочу хранить файл в БД в виде большого двоичного объекта, я не хочу его в файловой системе.

1 Ответ

3 голосов
/ 07 декабря 2011

Этот код сохранит ваш файл в каталоге «data / attachments» вашего проекта:

Модель

package models;

import play.db.jpa.Blob;
import play.db.jpa.Model;

import javax.persistence.Entity;

@Entity
public class MyApp extends Model {

   public String name;
   public Blob file;

}

Template

#{form action:@create(), enctype:'multipart/form-data'}
    #{crud.form /}

    <label for="uploadFile">File</label>
    <input type="file" id="uploadFile" name="myapp.file" />

    <p class="crudButtons">
        <input type="submit" name="_save"
            value="&{'crud.save', type.modelName}" />
        <input type="submit" name="_saveAndContinue"
            value="&{'crud.saveAndContinue', type.modelName}" />
    </p>
#{/form}

Контроллер

package controllers

import play.*;
import play.mvc.*;

import java.util.*;

import models.*;

/* Custom controller that extends
 * controller from CRUD module.
 */    
public class MyController extends CRUD {

    // ...

    // Will save your object
    public static void create(MyApp object) {

    /* Get the current type of controller and test it on non-empty */
    ObjectType type = ObjectType.get(getControllerClass());
    notFoundIfNull(type);

    /* We perform validation of the generated crud module form fields */
    validation.valid(object);
    if (validation.hasErrors()) {
        renderArgs.put("error", Messages.get("crud.hasErrors"));
        try {
            render(request.controller.replace(".", "/") + "/blank.html", type, object);
        } catch (TemplateNotFoundException e) {
            render("CRUD/blank.html", type, object);
        }
    }

    /* Save our object into db */
    object._save();

    /* Show messages */
    flash.success(Messages.get("crud.created", type.modelName));
    if (params.get("_save") != null) {
        redirect(request.controller + ".list");
    }
    if (params.get("_saveAndAddAnother") != null) {
        redirect(request.controller + ".blank");
    }

}

Как указано выше, вы просто дополняете форму crud своим собственным полем и переопределяете метод crud "create". То же самое можно сделать, чтобы обновить запись. Вы можете изменить каталог «data / attachments» в вашем application.conf:

application.conf

# ...
# Store path for Blob content
attachments.path=data/attachments
# ...

Подробнее см. http://www.lunatech -research.com / playframework-file-upload-blob

...