Только один файл загружается на FTP-сервер вместо нескольких файлов - код выглядит нормально ... (проблема с HttpServletRequest / Java Servlet) - PullRequest
0 голосов
/ 19 февраля 2019

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

Форма HTML (здесь я получаю адрес своего сервера, номер порта и файлы):

<form action="/ftp" method="post" enctype="multipart/form-data">

<label for="host">Plik:</label>
<input type="file" name="file" multiple="true" required><br>

<label for="host">Serwer:</label>
<input type="text" name="host" required><br>

<label for="user">Login:</label>
<input type="text" name="user" required><br>

<label for="pass">Pass:</label>
<input type="password" name="pass" required><br>

<label for="port">Port:</label>
<input type="text" name="port" value="21" required><br>

<input type="submit" value="Wyślij plik przez FTP"><br>
<button type="reset" name="reset">Wyczyść dane</button>

Сервлет Java (получение параметров из формы HTML):

@MultipartConfig
@WebServlet("/ftp")
public class FtpServlet extends HttpServlet {

private Logger logger = Logger.getLogger(getClass().getName());

@Inject
private FtpUploader ftpUploader;

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

    response.setContentType("text/html;charset=UTF-8");
    request.setCharacterEncoding("UTF-8");

    Map<String, Object> dataModel = new HashMap<>();

    List<InputStream> inputStreamList = getInputStreams(request);
    String fileName = "invoice" + System.currentTimeMillis() + ".xml";
    String server = request.getParameter("host");
    String user = request.getParameter("user");
    String pass = request.getParameter("pass");
    int port = Integer.parseInt(request.getParameter("port"));

    for (InputStream fileContent : inputStreamList){
        ftpUploader.sendThroughFtp(fileContent, fileName, server, user, pass, port);
    }
}

private List<InputStream> getInputStreams(HttpServletRequest request) throws IOException, ServletException {

    List<InputStream> inputStreamList = new ArrayList<>();
    List<Part> parts = request.getParts().stream().filter
            (part -> "file".equals(part.getName())).collect(Collectors.toList());

    for (Part part : parts) {
    InputStream fileContent = part.getInputStream();
    inputStreamList.add(fileContent);
    }
    return inputStreamList;
}

}

Класс FTPUploader (предоставляет метод для загрузки файлов на FTP-сервер):

@ApplicationScoped
public class FtpUploader {

private Logger logger = Logger.getLogger(getClass().getName());

public void sendThroughFtp(InputStream inputStream, String fileName, String server, String user, String pass, int port) {

    FTPClient ftpClient = new FTPClient();
    try {

        ftpClient.connect(server, port);
        ftpClient.login(user, pass);
        ftpClient.enterLocalPassiveMode();
        ftpClient.setFileType(FTP.BINARY_FILE_TYPE);

        logger.log(Level.INFO, "Started uploading the file.");

        boolean done = ftpClient.storeFile(fileName, inputStream);
        inputStream.close();
        if (done) {
            logger.log(Level.INFO, "The file was uploaded successfully.");
        }

    } catch (IOException e) {
        logger.log(Level.SEVERE, e.getMessage());
    } finally {
        try {
            if (ftpClient.isConnected()) {
                ftpClient.logout();
                ftpClient.disconnect();
            }
        } catch (IOException e) {
            logger.log(Level.SEVERE, e.getMessage());
        }
    }
}

}

Я знаю, что все inputStreamsправильно добавлен в список.

Не могли бы вы помочь мне найти ошибку?

...