Файл только частично загружен на сервер - PullRequest
1 голос
/ 25 февраля 2012

Я пытаюсь загрузить файл на мой сервер Spring, работающий на Tomcat7.Это простой запрос POST, код которого приведен ниже:

@RequestMapping(method = RequestMethod.POST)
    public void saveFile(HttpServletRequest request, @RequestParam("file_name") String fileName) {
        Logger.getLogger(FileRestAction.class).info("saving file with name " + fileName);
        try {
            byte[] buf = readFromRequest(request);
            String filePath = writeToFile(buf, fileName);
            File_ file = new File_(filePath, request.getContentType());
            Logger.getLogger(FileRestAction.class).info(request.getContentType() + " " + request.getContentLength());
            fService.save(file);
        } catch (IOException e) {
            Logger.getLogger(FileRestAction.class).error("Failed to upload file. " +
                    "Exception is: " + e.getMessage());
        }
    }

    private String writeToFile(byte[] buf, String fileName) throws IOException {
        String fileBasePath = ConfigurationProvider.getConfig().getString(Const.FILE_SAVE_PATH);
        File file = new File(fileBasePath + fileName);
        FileOutputStream fos = new FileOutputStream(file);
        fos.write(buf);
        fos.close();
        Logger.getLogger(FileRestAction.class).info("filepath: " + file.getAbsolutePath());
        return file.getAbsolutePath();
    }

    private byte[] readFromRequest(HttpServletRequest request) throws IOException {
        InputStream is = request.getInputStream();
        byte[] buf = new byte[request.getContentLength()];
        is.read(buf);
        is.close();
        return buf;
    }

Теперь проблема в том, что файл на сервере только «наполовину завершен», как будто все байты отсутствуют.Например, если я отправляю .png-файл размером 256x256 размером 54 кБ, файл, записанный на сервере, также имеет размер 54 кБ и 256x256, но фактическое изображение обрезается в самом начале (остальное пустое).Никаких исключений не выдается.

После небольшого тестирования я обнаружил, что отсечка составляет около 15-20 Кб (изображения ниже, которые полностью загружены).

Любые идеи относительно того, что можетвызвать это?

EDIT: Я изменил метод readFromRequest в соответствии с тем, что предложил GreyBeardedGeek.Теперь это выглядит так:

private byte[] readFromRequest(HttpServletRequest request) throws IOException {
        InputStream is = request.getInputStream();
        int fileLength = (int) request.getContentLength();
        byte[] buf = new byte[fileLength];
        int bytesRead = 0;
        while (true) {
            bytesRead += is.read(buf, bytesRead, fileLength - bytesRead);
            Logger.getLogger(FileRestAction.class).info("reading file: " + bytesRead + " bytes read");
            if (bytesRead == fileLength) break;
        }
        is.close();
        return buf;
    }

1 Ответ

2 голосов
/ 25 февраля 2012

InputStream.read не гарантирует чтение объема данных, которые вы запрашиваете.Размер, который вы запрашиваете, - это максимальное количество байтов, которое он будет читать.

Вот почему метод read () возвращает количество фактически прочитанных байтов.См. http://docs.oracle.com/javase/6/docs/api/java/io/InputStream.html#read(byte[])

Итак, ответ - читать несколько раз, пока read () не вернет -1

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