контекстный путь для загрузки файла без HttpRequest в приложении REST - PullRequest
0 голосов
/ 09 января 2012

Я создаю REST-приложение. Я хочу загрузить файл и сохранить его, например, в / WEB-INF / resource / uploads

Как я могу получить путь к этому каталогу? Мой контроллер выглядит так

@RequestMapping(value = "/admin/house/update", method = RequestMethod.POST)
public String updateHouse(House house, @RequestParam("file") MultipartFile file, Model model) {
    try {
        String fileName = null;
        InputStream inputStream = null;
        OutputStream outputStream = null;
        if (file.getSize() > 0) {
                inputStream = file.getInputStream();

                fileName =  "D:/" + file.getOriginalFilename();
                outputStream = new FileOutputStream(fileName);

                int readBytes = 0;
                byte[] buffer = new byte[10000];
                while ((readBytes = inputStream.read(buffer, 0, 10000)) != -1) {
                        outputStream.write(buffer, 0, readBytes);
                }
                outputStream.close();
                inputStream.close();
        }
    } catch(Exception ex) {
        ex.printStackTrace();
    }

    model.addAttribute("step", 3);
    this.houseDao.update(house);
    return "houseAdmin";
}

Второй вопрос ... как лучше всего загружать пользовательские файлы?

Ответы [ 2 ]

2 голосов
/ 09 января 2012

/WEB-INF - плохое место для хранения файловых загрузок. Нет никакой гарантии, что это фактический каталог на диске, и даже если это так, appserver может запретить доступ к нему для записи.

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

Кроме того, процесс переноса MultipartFile в другое место намного проще, чем вы его себе представляете:

@RequestMapping(value = "/admin/house/update", method = RequestMethod.POST)
public String updateHouse(House house, @RequestParam("file") MultipartFile srcFile, Model model) throws IOException {
    File destFile = new File("/path/to/the/target/file");
    srcFile.transferTo(destFile); // easy!

    model.addAttribute("step", 3);
    this.houseDao.update(house);
    return "houseAdmin";
}
1 голос
/ 09 января 2012

Вы не должны хранить файлы в /WEB-INF/resource/uploads. Этот каталог находится либо внутри вашей WAR (если упакован), либо взорван где-то внутри контейнера сервлета. Первый пункт назначения доступен только для чтения, и последний не должен использоваться для пользовательских файлов.

При хранении загруженных файлов обычно учитываются два места:

  1. Некоторая выделенная папка . Убедитесь, что пользователи не могут получить доступ к этому каталогу напрямую (например, к анонимной папке FTP). Обратите внимание, что как только ваше приложение будет запущено на нескольких компьютерах, у вас не будет доступа к этой папке. Поэтому рассмотрим некоторую форму сетевой синхронизации или общего сетевого диска.

  2. База данных . Это спорно, так как бинарные файлы, как правило, занимают много места. Но этот подход немного проще при распространении вашего приложения.

...