0

Goodmorning,

I am trying to download a Excel file that in my main method saves the excel file in my root folder of my project, but when I try it via the webapp with a HTTPServlet it gets saved in C:\User\MyUser\eclipse\jee-2020-03\eclipse\

I am trying to save my excel files not in a root folder but in a subfolder from my root folder (excel_files) so that I can clean the entire folder at once without removing too much important.

What am I doing wrong? And how can i save my files in the subfolder of my root?

ExcelController.java

package houseoftyping.controller;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.PrintWriter;
import java.nio.file.Paths;
import java.time.LocalDate;

import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.annotation.MultipartConfig;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.Part;

import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.ss.usermodel.WorkbookFactory;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;

import houseoftyping.domain.Course;
import houseoftyping.domain.User;
import houseoftyping.sql.SQLConnection;

/**
 * Servlet implementation class FormController
 */
@MultipartConfig
public class ExcelController extends HttpServlet {
    private static final long serialVersionUID = 1L;

    /**
     * @see HttpServlet#HttpServlet()
     */
    public ExcelController() {
        super();
        // TODO Auto-generated constructor stub
    }

    /**
     * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse
     *      response)
     */
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        if (request.getParameter("type").equals("upload")) {
            response.setContentType("text/plain");
            PrintWriter out = response.getWriter();
            handleUpload(request, response);
        } else if (request.getParameter("type").equals("downloadLatestExcel")) {
            handleDownload(request, response, false);
        } else if (request.getParameter("type").equals("downloadFullExcel")) {
            handleDownload(request, response, true);
        }
    }

    @SuppressWarnings("resource")
    private void handleDownload(HttpServletRequest request, HttpServletResponse response, boolean fullDownload) {
        Cookie[] cookies = request.getCookies();
        for (Cookie cookie : cookies) {
            if (cookie.getName().equals("Username")) {
                SQLConnection conn = new SQLConnection();
                User user = conn.findUserByName(cookie.getValue());
                XSSFWorkbook workbook = new XSSFWorkbook();
                LocalDate ld = LocalDate.now();
                String fileName = "";
                try {
                    if (request.getParameter("isAccountant").equals("true")) {
                        if (fullDownload) {
                            workbook = conn.fillWorkbookWithAllRegistrationsAccountant(workbook, user);
                            fileName = "export-inschrijvingen-" + ld.getDayOfMonth() + "-"
                                    + findFullMonthByInt(ld.getMonthValue()) + "-" + ld.getYear() + "-administratie";
                        } else {
                            workbook = conn.fillWorkbookWithLastRegistrationsAccountant(workbook, user);
                            fileName = "export-laatste-inschrijvingen-" + ld.getDayOfMonth() + "-"
                                    + findFullMonthByInt(ld.getMonthValue()) + "-" + ld.getYear() + "-administratie";
                        }
                    } else {
                        if (fullDownload) {
                            workbook = conn.fillWorkbookWithAllRegistrations(workbook, user);
                            fileName = "export-inschrijvingen-" + ld.getDayOfMonth() + "-"
                                    + findFullMonthByInt(ld.getMonthValue()) + "-" + ld.getYear();
                        } else {
                            workbook = conn.fillWorkbookWithLastRegistrations(workbook, user);
                            fileName = "export-laatste-inschrijvingen-" + ld.getDayOfMonth() + "-"
                                    + findFullMonthByInt(ld.getMonthValue()) + "-" + ld.getYear();
                        }
                    }
                    ServletOutputStream os = response.getOutputStream();
                    File file = new File(fileName + ".xlsx");
                    FileOutputStream fileOut = new FileOutputStream(file);
                    workbook.write(fileOut);
                    System.out.println(file.getAbsolutePath());
                    response.setContentType("application/vnd.ms-excel");
                    response.setHeader("Content-Disposition", "attachment; filename=" + fileName + ".xlsx");
                    fileOut.close();
                    workbook.close();
                    os.flush();
                    response.flushBuffer();
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }
    }

    public static String findFullMonthByInt(int monthValue) {
        switch (monthValue) {
        case 1:
            return "januari";
        case 2:
            return "februari";
        case 3:
            return "maart";
        case 4:
            return "april";
        case 5:
            return "mei";
        case 6:
            return "juni";
        case 7:
            return "juli";
        case 8:
            return "augustus";
        case 9:
            return "september";
        case 10:
            return "oktober";
        case 11:
            return "november";
        case 12:
            return "december";
        }
        return null;
    }

    private void handleUpload(HttpServletRequest request, HttpServletResponse response) {
        Part filePart = null;
        try {
            filePart = request.getPart("file");
        } catch (IOException e1) {
            // TODO Auto-generated catch block
            e1.printStackTrace();
        } catch (ServletException e1) {
            e1.printStackTrace();
        }
        String fileName = Paths.get(filePart.getSubmittedFileName()).getFileName().toString(); // MSIE fix.
        try {
            InputStream fileContent = filePart.getInputStream();
            Workbook workbook = WorkbookFactory.create(fileContent);
            createCoursesByWorkbook(workbook);
        } catch (Exception E) {
            E.printStackTrace();
        }
    }

    public void createCoursesByWorkbook(Workbook workbook) {
        Sheet sheet = null;
        for (Sheet s : workbook) {
            if (s.getSheetName().equals("import scholen")) {
                sheet = s;
            }
        }
        for (int j = 0; j < sheet.getPhysicalNumberOfRows(); j++) {
            if (j != 0) {
                Row row = sheet.getRow(j);
                int i = 0;
                Course c = new Course(row.getCell(i++).getStringCellValue().replaceAll("\\s", ""),
                        row.getCell(i++).getStringCellValue(), row.getCell(i++).getStringCellValue(),
                        String.valueOf(row.getCell(i++).getNumericCellValue()) + "0",
                        String.valueOf(row.getCell(i++).getNumericCellValue()) + "0");
                c.saveCourse();
            }
        }
    }

    /**
     * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse
     *      response)
     */
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        // TODO Auto-generated method stub
        doGet(request, response);
    }

}

This is one of the methods that fills my workbook (which works perfectly fine)

XSSFSheet sheet = workbook.createSheet("Inschrijven-site");
       int rowCount = 0;
       Row headerRow = sheet.createRow(rowCount++);
       int columnCount = 0;
       String allCellHeaderNames = "Cursuscode,Geslacht,Geboortedatum,Voornaam,Tussenvoegsel,Achternaam,Naam Ouders,Adres,Stad,Adres nummer,Postcode,E-mailadres,Telefoonnummer,IBAN,Ter name van,Betalingsoptie,Mandaatdatum,Mollie Afgerond(0=nee 1=ja),Factuursturen Afgerond(0=nee 1=ja)";
       String[] cellHeaderNames = allCellHeaderNames.split(",");
       for (int i = 0; i < 19; i++) {
           Cell cell = headerRow.createCell(columnCount++);
           cell.setCellValue(cellHeaderNames[i]);
       }
       SQLConnection sqlConnection = new SQLConnection();
       Connection conn = sqlConnection.getConnection();
       String query = "SELECT * FROM registration";
       try {
           Statement stmn = conn.createStatement();
           // execute the query, and get a java resultset
           ResultSet rs = stmn.executeQuery(query);
           while (rs.next()) {
               columnCount = 0;
               Row row = sheet.createRow(rowCount++);
               for (int i = 2; i < 21; i++) {
                   Cell cell = row.createCell(columnCount++);
                   cell.setCellValue(rs.getString(i));
               }
               if(rs.isLast()) {
                   user.updateLastExport(Integer.parseInt(rs.getString(1)));
               }
           }
       } catch (Exception e) {
           e.printStackTrace();
       }
       return workbook;
  • You have not provided a full path to the workbook, just a file name. – deHaar Jun 29 '20 at 08:51
  • I get that, but this goes into a live server, how can I just add the root folder? So that on every computer including the live server it works? – PRIVATE ACCOUNT Jun 29 '20 at 08:58
  • Does this code go into a live server or just the export file? – deHaar Jun 29 '20 at 09:00
  • Both, I want to save the export file to the liveserver so that it can be downloaded – PRIVATE ACCOUNT Jun 29 '20 at 09:09
  • You could use `java.nio` and provide a `Path` representing the root folder (or some other fixed one), or stick with `java.io` and provide a constant `String` like `C.\downloads` or similar (for a Windows file system). Then create the file path by appending the actual file name to that (constant) directory. – deHaar Jun 29 '20 at 09:19

0 Answers0