В настоящее время я создаю веб-страницу, которая отображает таблицу с данными из базы данных MySQL. Одним из столбцов является файл (хранится в виде BLOB в БД). Имя файла является тегом привязки, который ссылается на мой сервлет download.java. Мой сервлет загрузки работает при локальном развертывании, однако теперь, когда я развернул на экземпляре AWS ElasticBeanstalk, сервлет не работает.
В журнале написано следующее:
org.apache.coyote.http11.AbstractHttp11Processor.process Error parsing HTTP request header
Note: further occurrences of HTTP header parsing errors will be logged at DEBUG level.
java.lang.IllegalArgumentException: Invalid character found in the request target. The valid characters are defined in RFC 7230 and RFC 3986
и
/usr/share/tomcat8/Downloads/sdc.png (No such file or directory)
Код сервлета:
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
try {
Class.forName("com.mysql.cj.jdbc.Driver");
String url = "dbURL?serverTimezone=" + TimeZone.getDefault().getID();
Connection conn = DriverManager.getConnection(url , "username" , "password");
String fn = request.getParameter("Id");
String selectSQL = "SELECT file FROM Requests WHERE fileID=?";
PreparedStatement pstmt = conn.prepareStatement(selectSQL);
pstmt.setString(1, fn);
ResultSet rs = pstmt.executeQuery();
// write binary stream into file
String home = System.getProperty("user.home");
File file = new File(home+"/Downloads/" + fn);
FileOutputStream output = new FileOutputStream(file);
System.out.println("Writing to file " + file.getAbsolutePath());
while (rs.next()) {
InputStream input = rs.getBinaryStream("file");
byte[] buffer = new byte[1024];
while (input.read(buffer) > 0) {
output.write(buffer);
}
}
RequestDispatcher rd = request.getRequestDispatcher("/requests.jsp");
rd.forward(request, response);
rs.close();
pstmt.close();
} catch (SQLException | IOException e) {
System.out.println(e.getMessage());
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
Сервлет должен загрузить файл из БД Mysql в папку загрузки пользователей. Однако это работает только локально, на сервере AWS происходит сбой. Я предполагаю, что это потому, что:
String home = System.getProperty("user.home");
возвращает домашний путь экземпляра сервера AWS, а не домашний путь пользователей / посетителей.
Пожалуйста, помогите мне настроить мой сервлет так, чтобы он работал на сервере AWS
ОБНОВЛЕНИЕ: После некоторых исследований я думаю, что получить путь к папке загрузки клиента невозможно. Теперь я думаю, что мне нужно создать диалоговое окно «Сохранить как». Любые советы о том, как это сделать, и ресурсы, которые могут помочь мне сделать это, приветствуются