Загрузка нескольких изображений (Play Framework) - PullRequest
4 голосов
/ 20 февраля 2011

Я пытаюсь разрешить пользователю загружать несколько изображений, но когда я проверяю форму с некоторыми файлами, я получаю эту ошибку Неверное значение в поле изображений ... Вот мой код:

в представлении:

 #{form @save(id)}

    #{ifErrors}
        <p class="error">
            Please correct these errors.
        </p>
    #{/ifErrors}

    <p>
        <label>Titre</label>
        <input type="text" name="title" value="${flash.title}" id="title" />
        <span class="error">#{error 'title' /}
    </p>
    <p>
        <label>Description</label>
        <textarea name="detail" value="${flash.detail}" id="detail" /></textarea>
        <span class="error">#{error 'detail' /}
    </p>

    <p>
        <label>Photos</label>
        <input type="file" draggable="true" name="files" id="files" multiple="multiple"/> 
        <strong>(Max. 5 photos)</strong> <span class="error">#{error 'files' /}
    </p>
    <p>
        <input type="submit" value="Publier l'annonce" />
    </p>

 #{/form}

функция Java:

    public static void save(long id, @Required String title, @Required String detail, File[] files) throws IOException{ 
        if (id == 0){
            validation.keep();
            params.flash();
            flash.error("Vous devez préalablement selectionner une catégorie...");
            Application.setclassified();
        }
        // Action when form errors found 
        else if (validation.hasErrors() ) {
            validation.keep();
            params.flash();
            flash.error("Veuillez corriger les erreurs...");
            form(id);
        }
        //save uploaded images
        for (File file : files) { 
            FileInputStream is = new FileInputStream(file); 
            String original = "/data/" + file.getName();
            IOUtils.copy(is, new FileOutputStream(Play.getFile(original))); 

        }  
 }    

Ответы [ 2 ]

8 голосов
/ 21 февраля 2011

Вы используете поле HTML5 для загрузки файла DnD, не так ли? Я не знаю, какие функции предоставляет JS, но обычно, когда вы удаляете файл, он автоматически загружает его. Я полагаю, вы можете имитировать функцию загрузки на YouTube. Например:

После загрузки файла верните json с сгенерированным идентификатором файла, чтобы при сохранении записей вы могли связать его с только что загруженным файлом.

Когда я играл с ним, обычно javascript откроет новый POST-запрос, этот запрос вы должны получить из request.body, который является InputStream, используйте этот InputStream с IOUtils для сохранения файла, после сохранения верните JSON-объект с именем файла или путем к файлу.

Дело в том, что я не думаю, что он никогда не пройдет через File files[], потому что javascript открывает новый запрос POST, поэтому он всегда будет возвращать неверное значение, так как он никогда не заполняется, когда вы отправляете данные на стороне сервера.

Вы можете попробовать это: создать два маршрута, один, который загружает файл, один, который сохраняет метаданные файла, одним методом вы выполняете всю обработку файла, другой захватывает возврат json и связывает его затем сохраните :)

Я также разместил здесь несколько примеров кодов на похожий вопрос: PlayFramework: Ajax + Drag n 'Drop + Загрузка файла + Файловый объект в контроллере?

Привет, извините, если я звучу немного излишне, немного устал, но я надеюсь, что это поможет вам:)

3 голосов
/ 14 июля 2011

Загрузка файлов должна быть принудительно установлена ​​в 'multipart / form-data' для файлов, которые будут обрабатываться в среде воспроизведения.В противном случае массив файлов будет нулевым.

Настройте форму следующим образом:

 #{form @save(id), enctype:'multipart/form-data'}
...