Как загрузить файл удаленно в базу данных MySQL с помощью jdbc, servlets и html - PullRequest
0 голосов
/ 03 мая 2018

Я пытался удаленно загрузить файл со страницы html в сервлет и затем сохранить его в базе данных, пока мне удалось сделать это локально, но при использовании другого компьютера в той же сети я получаю и ошибка, объясняющая, что системе не удалось найти указанный файл.

Я использую следующую форму для получения файлов:

       <form method="post" action="UploadFile" enctype="multipart/form-data">                    
       <tr>
          <td><Input name="name" type="text"></td>
          <td><Input name="client_ID" type="text" required></td>
          <td><input name="date" type="date"></td>
          <td><input name="pdf" type="file"></td>
          <td><input name="xml" type="file"></td>
      </tr>
      </form>

Какая ссылка на следующее действие в сервлете:

    String url = "jdbc:mysql://localhost/database";
    Connection con;
    String path1=request.getParameter("pdf");
    String path2=request.getParameter("xml");
    String name=request.getParameter("name");
    String date=request.getParameter("date");
    String client=request.getParameter("client_ID");
    Class.forName("com.mysql.jdbc.Driver");
    con = DriverManager.getConnection(url,"user", "password");
    PreparedStatement stat = con.prepareStatement("insert into table(pdf, xml, date, client, employee_ID, client_ID) values(?,?,?,?,1,?)");
    InputStream is = new FileInputStream(new File(path1));
    stat.setBlob(1,is);
    InputStream is2 = new FileInputStream(new File(path2));
    stat.setBlob(2,is2);
    stat.setString(3,date);
    stat.setString(4,name);
    stat.setString(5,client);

И выдает следующее исключение:

java.io.FileNotFoundException: file.pdf (The system could not find the specified file)

Я понимаю, что проблема в том, что сервлет пытается загрузить файл с хоста. Любая помощь будет оценена.

Ответы [ 2 ]

0 голосов
/ 06 мая 2018

Вы читаете имя файла из запроса, но затем вы пытаетесь прочитать содержимое файла с диска, когда содержимое файла фактически в запросе .

Попробуйте, чтобы начать:

String url = "jdbc:mysql://localhost/database";
Connection con;
String name=request.getParameter("name");
String date=request.getParameter("date");
String client=request.getParameter("client_ID");
Class.forName("com.mysql.jdbc.Driver");
con = DriverManager.getConnection(url,"user", "password");
PreparedStatement stat = con.prepareStatement("insert into table(pdf, xml, date, client, employee_ID, client_ID) values(?,?,?,?,1,?)");

javax.servlet.http.Part pdf = request.getPart("pdf"); // <-- get multipart part from request
InputStream is = pdf.getInputStream();                // <-- get input stream from multipart part
javax.servlet.http.Part xml = request.getPart("xml"); // <-- get multipart part from request
InputStream is2 = xml.getInputStream();                // <-- get input stream from multipart part

stat.setBlob(1,is);
stat.setBlob(2,is2);
stat.setString(3,date);
stat.setString(4,name);
stat.setString(5,client);

Теперь ... в вашем коде есть куча других проблем, о которых нужно будет поговорить позже, когда у вас все заработает. В произвольном порядке они:

  1. Проверьте все получаемые данные, чтобы убедиться, что они нормальные. Это нормально для меня, чтобы загрузить документ 2 ГБ в вашу базу данных? Как насчет файла с расширением PDF, который на самом деле является файлом XML? Как насчет обратного? Если вы ожидаете, что PDF-файл будет PDF, а XML-файл - XML, вам лучше проверить, что именно отправляет клиент. Не вставляйте в свою базу данных ничего, что вы не проверяли, чтобы убедиться, что она законна и уместна.
  2. Использовать пул соединений JDBC. Прекратите звонить Class.forName() и DriverManager.getConnection() при каждом запросе.
  3. Рефакторинг вашего кода на отдельные части: один для получения данных из запроса и один для записи в базу данных. Нет веской причины выполнять действия HTTP и JDBC из одного и того же фрагмента кода. Что это, PHP?
  4. Управление ресурсами: убедитесь, что все ваши закрываемые ресурсы управляются должным образом, используя блоки try/catch/finally для очистки всего. Это включает в себя Part элементов, для которых должен быть вызван метод delete(), когда вы закончите с ними.
0 голосов
/ 03 мая 2018

Этот вопрос является дубликатом этого. читать содержимое файла загрузки в java

  1. Сначала необходимо сохранить файл на локальном жестком диске.
  2. Отправка локального файла жесткого диска в базу данных MySql.

Чтение потоков и сохранение их на локальном хардиске.

     String path1=request.getParameter("pdf");
     //read this and save the content to local harddisk, location e.g. C:\\temp\\A.pdf
     String path2=request.getParameter("xml");
     //read this and save the content to local harddisk, location e.g. C:\\temp\\B.xml

Теперь передайте локальный путь в MySql Query.

InputStream is = new FileInputStream(new File("C:\tmp\A.pdf"));
stat.setBlob(1,is);
InputStream is2 = new FileInputStream(new File("C:\tmp\B.xml"));
stat.setBlob(2,is2);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...