Получение различной длины в request.getInputStream для одного и того же файла - PullRequest
0 голосов
/ 19 декабря 2011

У меня есть загрузчик файлов на моем сайте, так как я не могу использовать php, я использую страницы jsp.Моя главная страница использует скрытый iframe для публикации данных на второй странице jsp, которая обрабатывает загрузку.Однако загруженные изображения всегда повреждены, точнее, они больше по размеру, чем исходный файл.Любые советы или подсказки будут оценены.Код главной страницы:

<form id="uploadForm">
    <input type="file" name="datafile" /></br>
    <input type="button" value="upload" onClick="fileUpload(document.getElementById('uploadForm'),'single_upload_page.jsp','upload'); return false;" >
</form>

Код для fileUpload относительно формы:

form.setAttribute("target","upload_iframe");
form.setAttribute("action", action_url);
form.setAttribute("method","post");
form.setAttribute("enctype","multipart/form-data");
form.setAttribute("encoding","multipart/form-data");

// Submit the form...
form.submit();

Код, который обрабатывает загрузку:

DataInputStream in = new DataInputStream(request.getInputStream());
int dataLength = request.getContentLength();

Из-за различийразмер dataLength Я предполагаю, что request.getInputStream получает дополнительные данные.

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

1 Ответ

0 голосов
/ 19 декабря 2011

Простой запрос

Проблема в том, что request.getContentLength () задает длину запроса целом , содержащего заголовки и все.

Вы должны искать значение заголовка Content-Length, конвертировать его в Long, и это правильный размер.

, если вы не можете его получить (он может быть недоступен), просто используйте весь поток ввода.Но, конечно, вы не будете иметь представление о размере файла.

Многокомпонентный запрос

В любом случае ... поскольку ваша форма состоит из нескольких частей / данных формы, вам следуетиспользуйте некоторую библиотеку для анализа всех различных частей, найдите нужную вам (файловую часть) и прочитайте ее.Вы можете использовать commons-fileupload .

Образец из реальной жизни

@Override
protected void doPost(HttpServletRequest request, HttpServletResponse resp)
        throws ServletException, IOException 
{
        // (....)
        FileItemFactory factory = new DiskFileItemFactory();
        ServletFileUpload sfu = new ServletFileUpload(factory);
        FileItemIterator it = sfu.getItemIterator(request);
        // TAKE THE FIRST PART FROM REQUEST (HERE COMES THE FILE)
        if (it.hasNext())
        {
            FileItemStream fis = it.next();
            // grab data from fis (content type, name)
            ...fis.getContentType()...
            ...fis.getName()...
            // GET CONTENT LENGTH SEARCH FOR THE LENGTH HEADER
            ...getContentLength(fis.getHeaders(), request)...
            // here I use an own method to process data
            // but FileItemStream has an openStream method
            FileItem item = processUpload(factory, fis, uploadInfo);
            (....)
        }



private long getContentLength(FileItemHeaders pHeaders, HttpServletRequest request)
{
    try
    {
        return Long.parseLong(pHeaders.getHeader("Content-length"));
    }
    catch (Exception e)
    {
                    // if I can't grab the value return an approximate (in my case I don't care)
        return request.getContentLength();
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...