Загрузка файла из БД mySQL через сервлет, размещенный на AWS - PullRequest
0 голосов
/ 19 июня 2019

В настоящее время я создаю веб-страницу, которая отображает таблицу с данными из базы данных 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

ОБНОВЛЕНИЕ: После некоторых исследований я думаю, что получить путь к папке загрузки клиента невозможно. Теперь я думаю, что мне нужно создать диалоговое окно «Сохранить как». Любые советы о том, как это сделать, и ресурсы, которые могут помочь мне сделать это, приветствуются

1 Ответ

0 голосов
/ 04 июля 2019

Я смог заставить свой сервлет работать, используя код, указанный в вопросе здесь

Мой рабочий код теперь выглядит следующим образом:

 protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        Connection conn = null;
        try {
            // Get Database Connection.
            Class.forName("com.mysql.cj.jdbc.Driver");
            String url = "dbURL?serverTimezone=" + TimeZone.getDefault().getID();
            conn = DriverManager.getConnection(url , "username" , "password");
            String fileName = request.getParameter("Id");
            System.out.println("File Name: " + fileName);
            // queries the database
            String sql = "SELECT file FROM requests WHERE fileID= ?";
            PreparedStatement statement = conn.prepareStatement(sql);
            statement.setString(1, file);
            ResultSet result = statement.executeQuery();
            if (result.next()) {
                // gets file name and file blob data
                Blob blob = result.getBlob("file");
                InputStream inputStream = blob.getBinaryStream();
                int fileLength = inputStream.available();

                System.out.println("fileLength = " + fileLength);

                ServletContext context = getServletContext();

                // sets MIME type for the file download
                String mimeType = context.getMimeType(fileID);
                if (mimeType == null) {         
                    mimeType = "application/octet-stream";
                }               

                // set content properties and header attributes for the response
                response.setContentType(mimeType);
                response.setContentLength(fileLength);
                String headerKey = "Content-Disposition";
                String headerValue = String.format("attachment; filename=\"%s\"", fileID);
                response.setHeader(headerKey, headerValue);

                // writes the file to the client
                OutputStream outStream = response.getOutputStream();

                byte[] buffer = new byte[1024];
                int bytesRead = -1;

                while ((bytesRead = inputStream.read(buffer)) != -1) {
                    outStream.write(buffer, 0, bytesRead);
                }        
                inputStream.close();
                outStream.close();              
            } 
            else {
                // no file found
                response.getWriter().print("File not found for the fn: " + fileName);   
            }
        } catch (Exception e) {
            throw new ServletException(e);
        } 
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...