Использование Apache Commons FileUpload

Это просто не сработает. Проблема в том, что я не знаю достаточно, чтобы даже знать, что должно произойти. Я не могу отладить этот код. Я хочу сохранить закачанные файлы во временную папку «temp», а затем переместить их в «апплеты». Пожалуйста помоги? Очевидно, что к сервлету осуществляется доступ, но я не могу найти загруженные файлы ... Заранее спасибо.

Форма (которая создается с помощью скриптлета - я помещаю ее сюда, если это может вызвать проблемы):

<%
out.write("<p>Upload a new game:</p>");
                    out.write("<form name=\"uploadForm\" action=\"game.jsp\" "
                    + "method=\"POST\" enctype=\"multipart/form-data\">"
                    + "<input type=\"file\" name=\"uploadSelect\" value=\"\" width=\"20\" />"
                    + "<br><input type=\"submit\" value=\"Submit\" name=\"uploadSubmitButton\" "
                    + "onclick = \"submitToServlet2('UploadGameServlet');\">"        
                    + "</form>");
 %>

Что вызывает этот javascript:

function submitToServlet2(newAction)
    {
       document.uploadForm.action = newAction;
    }

Что, в свою очередь, переходит к сервлету (код включен полностью, так как некоторые важные элементы могут быть скрыты)

package org.project;

import java.io.*;
import java.util.Iterator;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
// import servlet stuff
import org.apache.commons.fileupload.*;


public class UploadGameServlet extends HttpServlet {

/** 
* Processes requests for both HTTP <code>GET</code> and <code>POST</code> methods.
* @param request servlet request
* @param response servlet response
*/
protected void processRequest(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
    response.setContentType("text/html;charset=UTF-8");

    if (ServletFileUpload.isMultipartContent(request))
    {
        try 
        {
            // Create a factory for disk-based file items
            FileItemFactory factory = new DiskFileItemFactory();

            // Create a new file upload handler
            ServletFileUpload upload = new ServletFileUpload(factory);

            // Parse the request
            List items = upload.parseRequest(request); /* FileItem */

            File repositoryPath = new File("\\temp");
            DiskFileItemFactory diskFileItemFactory = new DiskFileItemFactory();
            diskFileItemFactory.setRepository(repositoryPath);

            Iterator iter = items.iterator();
            while (iter.hasNext()) 
            {
                FileItem item = (FileItem) iter.next();
                File uploadedFile = new File("\\applets");
                item.write(uploadedFile);
            }            
        }
        catch (FileUploadException ex) 
        {
            Logger.getLogger(UploadGameServlet.class.getName()).log(Level.SEVERE, null, ex);
        }
        catch (Exception ex) 
        {
            Logger.getLogger(UploadGameServlet.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    PrintWriter out = response.getWriter();
    try {
        out.println("<html>");
        out.println("<head>");
        out.println("<title>Servlet UploadGameServlet</title>");  
        out.println("</head>");
        out.println("<body>");
        out.println("<h1>Servlet UploadGameServlet at " + request.getContextPath () + "</h1>");
        out.println("</body>");
        out.println("</html>");
    } finally { 
        out.close();
    }
} 

}

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

Miguel Ping 22.10.2008 20:15

Да, сервер выводит заголовок ... Так что я знаю, что он хотя бы доходит до строк вывода. Как я могу отладить код сервлета?

pypmannetjies 22.10.2008 20:23

Вы можете попытаться добавить несколько операторов ведения журнала в свой if. Кроме того, регистрируются ли какие-либо исключения?

Steve K 22.10.2008 20:48
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
3
8 314
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий
File repositoryPath = new File("\\temp");
File uploadedFile = new File("\\applets");

Пытаясь получить доступ к этим файлам без какого-либо начального или абсолютного пути, вы пытаетесь выполнить запись в файлы (не каталоги) с именами temp и applets в текущем рабочем каталоге. На сервере приложений текущим рабочим каталогом обычно является папка bin (зависит от того, какой сервер приложений вы используете и т. д.).

Некоторые предложения:

  1. Используйте абсолютный путь (предпочтительно сохраненный в web.xml или файле свойств) для ссылки на каталог, в который вы хотите сохранить файлы.
  2. Вы должны указать имя файла, в который хотите писать, вы, вероятно, захотите создать какое-то случайное / уникальное имя для каждого запроса.
  3. Сэкономьте несколько нажатий клавиш и используйте переменную-член вместо всех ссылок Logger.getLogger(UploadGameServlet.class.getName())!
  4. Добавьте некоторую отладку, особенно чтобы увидеть, куда вы записываете свои данные - например, зарегистрируйте результат repositoryPath.getAbsolutePath().

Это было действительно полезно, спасибо! Теперь он сохраняет файл ... но получает значение кнопки отправки вместо ввода выбора файла. Вы, может быть, знаете, почему?

pypmannetjies 22.10.2008 21:42

В исходном коде похоже, что вы записывали каждый элемент списка в один и тот же файл - возможно, каждый раз перезаписывая файл (я не уверен, как работает FileItem.write ()). Вероятно, вы захотите записать в файл только при определенных условиях, проверив FileItem.getFieldName ()

matt b 22.10.2008 21:46

О боже! Оно работает! Наконец-то работает! Большое вам спасибо! Возможно, вы только что сохранили мою семестровую отметку :)

pypmannetjies 22.10.2008 21:54

Stackoverflow не существует, чтобы «сохранить семестр», IMO

hd1 20.07.2013 08:37

В то время это помогло мне изучить и улучшить свои навыки. Так что семестровая отметка была счастливым побочным эффектом. Я не вижу в этом проблем.

pypmannetjies 29.08.2013 16:22

@mattb: Мэтт использует Apache Commons FileUpload для загрузки файла, но не может загружать файлы xmls, js, css, но отлично работает с pdf, txt, jsp. Не могли бы вы сказать мне, какие расширения файлов поддерживаются "Apache Commons FileUpload"

Shashank Vivek 09.07.2014 11:58

Другие вопросы по теме