PlayFramework: Ajax + Drag n 'Drop + Загрузка файла + Файл объекта в контроллере? - PullRequest
15 голосов
/ 01 февраля 2011

Кто-нибудь знает способ загрузки файла через Ajax и использования перетаскивания с рабочего стола, который поддерживает способность PlayFramework преобразовывать загрузки файлов в объект File?

Я пробовал несколько различных методов, и ничего не работает правильно.

Ответы [ 3 ]

22 голосов
/ 04 февраля 2011

Вот моя успешная попытка:

Редактировать файл маршрутов и добавить

POST    /upload                                 Application.upload

Наш контроллер Application, я буду использовать его для простоты.

Редактирование класса контроллера вашего приложения

public static void upload(String qqfile) {


if (request.isNew) {

    FileOutputStream moveTo = null;

    Logger.info("Name of the file %s", qqfile);
    // Another way I used to grab the name of the file
    String filename = request.headers.get("x-file-name").value();

    Logger.info("Absolute on where to send %s", Play.getFile("").getAbsolutePath() + File.separator + "uploads" + File.separator);
    try {

        InputStream data = request.body;


        moveTo = new FileOutputStream(new File(Play.getFile("").getAbsolutePath()) + File.separator + "uploads" + File.separator + filename);
        IOUtils.copy(data, moveTo);

    } catch (Exception ex) {

        // catch file exception
        // catch IO Exception later on
        renderJSON("{success: false}");
    }

}


renderJSON("{success: true}");
} 

Отредактируйте файл Application.html в app / views / папке приложения / package

#{extends 'main.html' /}
#{set title:'Multiple Uploads' /}

<div id="file-uploader">
    <noscript>
        <p>Please enable JavaScript to use file uploader.</p>
        <!-- or put a simple form for upload here -->
    </noscript>

    <script>
        function createUploader(){
            var uploader = new qq.FileUploader({
                element: document.getElementById('file-uploader'),
                action: '/upload',
                debug: true
            });
        }

        // in your app create uploader as soon as the DOM is ready
        // don't wait for the window to load
        window.onload = createUploader;
    </script>    
</div>

Отредактируйте основной макет: main.html, расположенный в папке app / views / package, и добавьте эту строку после jQuery

<script src="@{'/public/javascripts/client/fileuploader.js'}" type="text/javascript"></script>

Заключительные замечания Не забудьте скачать скрипт с AJAX Upload Valums , наслаждайтесь!

Вы также можете взять источник здесь .

Я тестировал его в разных браузерах, по крайней мере, он работает для меня. Кредиты Рияду в игре! список рассылки, который намекнул мне о request.body

P.S .: Я использую тот, который я разместил в качестве комментария до

Редактировать Ответ с кодом был добавлен по указанию T.J. Краудер, согласен :)

1 голос
/ 15 января 2012

Простая часть загрузки (не перетаскивание, просто нажмите «загрузить файл») не работает с Ie7 & 8 (не пытайтесь другие, т. Е.)

См. получение Java Bad File Descriptor ЗакрытьОшибка при чтении http / multipart / form-data body

0 голосов
/ 03 февраля 2011

Не совсем уверен, что это будет квалифицироваться как ответ, так как я не уверен на сто процентов, что это сработает. Но это должно работать :)

Если я вас правильно понимаю, вы хотите перетащить файлы с рабочего стола и поместить их в зону размещения в браузере. Это инициирует вызов загрузки AJAX на сервер воспроизведения.

У меня есть вторая часть этой работы, использующая прямой пост jquery ajax. Файлы получены просто отлично. Для первой части я бы попробовал использовать поддержку dnd в html 5 (прокрутите вниз до Dragg Files):

http://www.html5rocks.com/tutorials/dnd/basics/

...