У меня проблема при загрузке нескольких файлов с моего диска на 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правильно добавлен в список.
Не могли бы вы помочь мне найти ошибку?