Загрузка нескольких файлов в режиме playframework - PullRequest
5 голосов
/ 03 октября 2011

У меня проблемы с загрузкой нескольких файлов.Когда я выбираю x файлов, он проходит успешно, но первый файл загружается x раз, а остальные вообще не загружаются.Кто-нибудь может указать, что я делаю неправильно?

Форма:

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

<p>
    <label>&{'title'}</label>
    <input type="text" name="title"/>
    <strong>(&{'addPicture.chooseTitle'})</strong>
</p>
<p>
    <label>&{'Pictures'}</label>
    <input type="file" multiple name="files" id="files"/>
</p>
<p>
    <input type="submit" value="&{'publish'}" />
</p>

#{/form}

Обработка файлов:

public static void uploadPictures(long id, String title, List<Blob> files) {
    String error = "";        
    if(files != null && !title.trim().equals("")) {
        Project project = Project.findById(id);
        // Save uploaded files
        Picture picture;

        for(int i = 0; i<files.size(); i++) {
            if(files.get(i) != null) {
                System.out.println("i: "+i+"\nFiltype: "+files.get(i).type());
                if(files.get(i).type().equals("image/jpeg") || files.get(i).type().equals("image/png")) {
                    picture = new Picture(project, title+"_bilde_"+(i+1), files.get(i));
                    project.addPicture(picture);
                } else {
                    error += "Fil nummer "+(i+1)+" er av typen "+files.get(i).type()+" og ikke av typen .JPG eller .PNG og ble dermed ikke lagt til. \n";
                }
            } else {
                error = "Ingen filer funnet";
            }
        }
    } else {
        error = "Velg en tittel for bildene";
    }
    if(error.equals("")) {
        flash.success("Picture(s) added");
    } else {
        flash.error(error);
    }
    addPicture(id);
}

Ответы [ 3 ]

3 голосов
/ 04 октября 2011

Работайте так, если кому-то когда-нибудь будет интересно:

public static void uploadPictures(long id, String title, File fake) {
    List<Upload> files = (List<Upload>) request.args.get("__UPLOADS");
    if(files != null) {
        Project project = Project.findById(id);
        Picture picture;
        Blob image;
        InputStream inStream;
        for(Upload file: files) {
            if(file != null) {
                try {
                    inStream = new java.io.FileInputStream(file.asFile());
                    image = new Blob();
                    image.set(inStream, new MimetypesFileTypeMap().getContentType(file.asFile()));
                    picture = new Picture(project, file.getFileName(), image);
                    project.addPicture(picture); // stores the picture
                } catch (FileNotFoundException e) {
                    System.out.println(e.toString());
                }
            }
        }
    }
    addPicture(id); //renders the image upload view
}

Был бы рад получить рабочее решение с массивом объектов Blob вместо того, чтобы по возможности запрашивать request.args.get ("__ UPLOADS").

2 голосов
/ 28 декабря 2011

Таким образом, вы можете использовать @As, чтобы привязать обработку параметра к определенному типу привязки Play

Так вот с этим:

public static void chargedMultiUpload(@As(binder = FileArrayBinder.class) Object xxx) throws IOException{ ... }

И этот HTML

<input type="file" multiple name="files" id="files"/>

Итак, вы должны сделать приведение с чем-то вроде File [] doo = (File []) xxx;

0 голосов
/ 03 октября 2011

Не должно ли <input type="file" multiple name="files" id="files"/> быть: <input type="file multiple" name="files" id="files"/>?

Во-вторых, где вы на самом деле сохраняете свое изображение? Я думаю, что вы должны сохранить его в цикле, где вы положили project.addPicture(picture);, но на самом деле это выглядит так, как будто изображения сохраняются в системе в вашей последней строке: addPicture(id); Это своего рода объясняет, почему оно сохраняет то же изображение (последнее или первый (не уверен, как они анализируются)) несколько раз.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...