BG Development


  Reply to this topicStart new topicStart Poll

> Servlet - a не качва фаиловете
Meniak
Публикувано на: 11-08-2019, 14:57
Quote Post



Име:
Група: Потребител
Ранг: Новопостъпил

Мнения: 48
Регистриран на: 05.11.18



Здрасти.
Та имам два два сервлета, единия взема информацията от полетата в формата и я записва в MySQL базаданни а другия трябва да качва файловете ама неще icon_lol.gif

Това е кода на сервлета дето качва информацията в базатаданни
CODE

@WebServlet(name = "UploadSoftwere", urlPatterns = {"/UploadSoftwere"})
@MultipartConfig
public class UploadSoftwere extends HttpServlet {

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

       Connection con = DBConnection.getConnection();
       PreparedStatement pst = null;

       String name = request.getParameter("name");
       String licens = request.getParameter("licens");
       String os = request.getParameter("os");
       String architecture = request.getParameter("arch");
       String siteManufacturer = request.getParameter("site");
       String category = request.getParameter("category");
       String subject = request.getParameter("subject");
       String link = request.getParameter("link");
       
       Part picPart = request.getPart("pic");
       String pic = picPart.getSubmittedFileName();
       
       Part filePart = request.getPart("softwere");
       String file = filePart.getSubmittedFileName();
       
       Timestamp date = Date.getTimestamp();

       String sql = "INSERT INTO ssmeniak.software (name, licens, os, architecture, siteManufacturer, category, subject, picName, fileName, downloadLink, dateAdded) VALUE (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)";
       try {
           pst = con.prepareStatement(sql);
           pst.setString(1, name);
           pst.setString(2, licens);
           pst.setString(3, os);
           pst.setString(4, architecture);
           pst.setString(5, siteManufacturer);
           pst.setString(6, category);
           pst.setString(7, subject);
           pst.setString(8, pic);
           pst.setString(9, file);
           pst.setString(10, link);
           pst.setTimestamp(11, date);
           pst.executeUpdate();

           request.getRequestDispatcher("uploadFiles").forward(request, response);
       } catch (SQLException e) {
           System.out.println(e.getMessage());
       } finally {
           if (pst != null) {
               try {
                   pst.close();
               } catch (SQLException e) {
                   System.out.println(e.getMessage());
               }
           }
           if (con != null) {
               try {
                   con.close();
               } catch (SQLException e) {
                   System.out.println(e.getMessage());
               }
           }
       }
   }
}


А това е кода на сервлета дето качва файловете

CODE

@WebServlet(name = "UploadFiles", urlPatterns = {"/UploadFiles"})
public class UploadFiles extends HttpServlet {

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

       String uploadDirectory = "/home/simeon/Downloads";
       int memoryThreshold = 1024 * 1024 * 3;  // 3MB
       int maxFileSize = 1024 * 1024 * 50; // 50MB
       int maxRequestSize = 1024 * 1024 * 80; // 80MB

       DiskFileItemFactory factory = new DiskFileItemFactory();
       factory.setSizeThreshold(memoryThreshold);

       ServletFileUpload upload = new ServletFileUpload(factory);
       upload.setFileSizeMax(maxFileSize);
       upload.setSizeMax(maxRequestSize);

       try {
           @SuppressWarnings("unchecked")
           List<FileItem> formItems = upload.parseRequest(request);
           String fileName1 = "";
           if (formItems != null && formItems.size() > 0) {
               for (FileItem item : formItems) {
                   if (!item.isFormField()) {
                       String fileName = new File(item.getName()).getName();
                       fileName1 += fileName;
                       String filePath = uploadDirectory + File.separator + fileName;
                       File storeFile = new File(filePath);
                       item.write(storeFile);
                   }
               }
           }
           request.setAttribute("succesMessage", "Upload has been done successfully.");
       } catch (Exception e) {
           System.out.println(e.getMessage());
       }
       request.getRequestDispatcher("/admin/uploadSoftwere.jsp").forward(request, response);
   }
}


Сервлетите по отделно работят но заедно не и не знам каква е причината.
PMEmail Poster
Top
thrawn
Публикувано на: 12-08-2019, 07:41
Quote Post



Име:
Група: Потребител
Ранг: Почетен член

Мнения: 2449
Регистриран на: 17.01.17



getRequestDispatcher какво връща?
PMEmail Poster
Top
Gamma Goblin
Публикувано на: 12-08-2019, 10:36
Quote Post



Име:
Група: Потребител
Ранг: Почетен член

Мнения: 2690
Регистриран на: 21.02.18



Няколко съвета:

1. СексКюЕл заявката я изнеси като константа
2. Вместо да подаваш датата на записване като параметър, ползвай sql функция като now() или current_timestamp()
3. Валидирай си параметрите преди да отвориш връзка към базата
4. Ползвай try-with-resources
5. Качвай файловете извън транзакцията
6, връзката към базата трябва да се държи отворена колкото се може за по-кратко
7. Не ползвай System.out, ами истински логер


--------------------
https://www.rust-lang.org/
---
Хора, които са прекалено умни, за да се занимават с политика, са наказани да бъдат управлявани от глупаци.
---
Life is hard; it's harder when you're stupid.
---
Black metal is like coffee. You have to learn to drink it but when you get used to it, you just want it darker and darker
PMEmail PosterUsers Website
Top
thrawn
Публикувано на: 12-08-2019, 12:03
Quote Post



Име:
Група: Потребител
Ранг: Почетен член

Мнения: 2449
Регистриран на: 17.01.17



Бе това с конекцията е леко спорно. Дали ще се отваря нова връзка при всяка заявка или ще се ползва постоянна такава (или пул) си зависи от самото приложение. Лично аз винаги ползвам пул. Там имплементацията е такава, че close не затваря връзката а само я отбелязва като свободна и я връща обратно за повторно използване.
PMEmail Poster
Top
Gamma Goblin
Публикувано на: 12-08-2019, 12:22
Quote Post



Име:
Група: Потребител
Ранг: Почетен член

Мнения: 2690
Регистриран на: 21.02.18



Pool винаги се ползва, поради простата причина, че отварянто на нова връзка е изключително бавен процес. Наскоро дебъгвах едно спринг лайно и там шибания спринг се оказа че не ползва connection pool и един HTTP request минаваше за 800-900 миилисекунди. След като му сложих pool започнаха да минават за 20-30.

Проблема е, че като вземеш една връзка от пула, тя не може да се ползва от никой друг, затова трябва да се взимат за колкото се може по-кратко време.

Предполагам е очевидно защо е безсмислено да вземеш връзка от базата, нещо да фейлне (примерно няма "part" с име "pic") и ти да я върнеш с някакво закъснение без да си я ползвал изобщо. Или пък да я държиш отворена докато става самия upload (който също може да не успее)


--------------------
https://www.rust-lang.org/
---
Хора, които са прекалено умни, за да се занимават с политика, са наказани да бъдат управлявани от глупаци.
---
Life is hard; it's harder when you're stupid.
---
Black metal is like coffee. You have to learn to drink it but when you get used to it, you just want it darker and darker
PMEmail PosterUsers Website
Top
1 потребители преглеждат тази тема в момента (1 гости, 0 анонимни потребители)
Потребители, преглеждащи темата в момента:

Topic Options Reply to this topicStart new topicStart Poll

 


Copyright © 2003-2019 | BG Development | All Rights Reserved
RSS 2.0