Dear Lukasz, Any advice will be greatly appreciated. Thank you.
Regards Mahabir On Thu, Mar 14, 2024 at 5:03 PM Mahabir Gupta <mahabir...@gmail.com> wrote: > Dear Lukasz, > > This issue came after I upgraded from Struts 2.5 to Struts 6.0.3.2. The > .pdf and .docx files seem to be corrupted when I am trying to download the > files. Kindly advise. Thank you. > > Regards > Mahabir > > On Thu, Mar 14, 2024 at 1:38 PM Mahabir Gupta <mahabir...@gmail.com> > wrote: > >> Dear Lukasz, >> >> I am able to upload and download and open .txt file but for .pdf and >> .docx files, I am able to upload but when I download the pdf file, the file >> cannot be opened. For the .docx file when I try to click on the file, on >> the console it does show the log successfully download attachment file but >> on the frontend an error "System is unable to proceed with your request." >> is being displayed. >> >> public class getDotsMissionAction { >> >> public void downloadAttach(){ >> try { >> String filename = >> DotsFormUtil.cleanStringFile(request.getParameter("filename"));t >> String realname = >> DotsFormUtil.cleanStringFile(request.getParameter("name")); >> >> HttpSession session = (HttpSession) request.getSession(); >> String strDotsIdToken = (String) >> session.getAttribute("strDotsIdToken"); >> >> try{ >> if(strDotsIdToken == null || >> !strDotsIdToken.equals(filename.split("_")[0])) >> logger.error("strDotsIdToken is null or strDotsIdToken >> is not equal and Exception is thrown"); >> }catch (Exception e){ >> logger.info(e); >> } >> try { >> if(filename!= null){ >> try { >> ResourceBundle bundle = >> ResourceBundle.getBundle("resources.dotsDisplay"); >> String >> strDirectory=DotsFormUtil.cleanpString(bundle.getString("dots.attachments.path")); >> File f= new >> File(FilenameUtils.normalize(DotsFormUtil.cleanString(strDirectory+File.separator >> + filename))); >> String pattern = >> "[a-zA-Z0-9]{1,50}\\.[a-zA-Z0-9]{1,10}"; >> if(realname.matches(pattern)){ >> response.reset(); >> response.setCharacterEncoding("UTF-8"); >> response.setContentType("application/pdf"); >> >> response.setContentType("application/vnd.openxmlformats-officedocument.wordprocessingml.document"); >> >> response.setHeader("Content-Disposition","attachment; fileName=" +realname); >> } >> try ( >> OutputStream out2 = response.getOutputStream()){ >> Files.copy(f,out2); >> out2.flush(); >> } >> } catch (FileNotFoundException e){ >> e.printStackTrace(); >> logger.error(e.getMessage()); >> } >> } >> }catch (FileNotFoundException e){ >> e.printStackTrace(); >> logger.error(e.getMessage()); >> } >> logger.info("successfully download attachment file"); >> }catch (FileNotFoundException e){ >> e.printStackTrace(); >> logger.error(e.getMessage()); >> } >> } >> >> public static String cleanStringFile(String- aString){ >> if(aString==null) return null; >> String cleanString = ""; >> char cleanChar = '\0'; >> for(int i=0; i<aString.length(); i++){ >> cleanChar = cleanCharFile(aString.charAt(i)); >> if(cleanChar != '\0') cleanString+=cleanChar; >> } >> return cleanString; >> } >> >> private static char cleanCharFile(char aChar){ >> for(int i = 48; i<58; ++i){ >> if(aChar ==i) return (char) i; >> } >> for(int i = 65; i<91; ++i){ >> if(aChar ==i) return (char) i; >> } >> for(int i = 97; i<123; ++i){ >> if(aChar ==i) return (char) i; >> } >> >> switch (aChar){ >> case '.': >> return '.'; >> case '_': >> return '_'; >> case '-': >> return '-'; >> case '!': >> return '!'; >> } >> return '\0'; >> } >> >> >> This is my modified code >> >> public String downloadAttach() { >> HttpServletResponse response = ServletActionContext.getResponse(); >> try { >> String filename = >> DotsFormUtil.cleanStringFile(request.getParameter("filename"));t >> String realname = >> DotsFormUtil.cleanStringFile(request.getParameter("name")); >> >> HttpSession session = (HttpSession) request.getSession(); >> String strDotsIdToken = (String) >> session.getAttribute("strDotsIdToken"); >> >> try{ >> if(strDotsIdToken == null || >> !strDotsIdToken.equals(filename.split("_")[0])) >> logger.error("strDotsIdToken is null or strDotsIdToken is >> not equal and Exception is thrown"); >> }catch (Exception e){ >> logger.info(e); >> } >> try { >> if (filename != null) { >> ResourceBundle bundle = >> ResourceBundle.getBundle("resources.dotsDisplay"); >> String strDirectory = >> DotsFormUtil.cleanString(bundle.getString("dots.attachments.path")); >> File f = new File(strDirectory + File.separator + filename); >> String pattern = "[a-zA-Z0-9]{1,50}\\.[a-zA-Z0-9]{1,10}"; >> if (realname.matches(pattern)) { >> response.reset(); >> response.setCharacterEncoding("UTF-8"); >> >> String contentType; >> if (realname.toLowerCase().endsWith(".pdf")) { >> contentType = "application/pdf"; >> } else if (realname.toLowerCase().endsWith(".docx")) { >> contentType = >> "application/vnd.openxmlformats-officedocument.wordprocessingml.document"; >> } else { >> contentType = "application/octet-stream"; >> } >> response.setContentType(contentType); >> response.setHeader("Content-Disposition", "attachment; >> filename=" + realname); >> >> try (FileInputStream fis = new FileInputStream(f); >> OutputStream out2 = response.getOutputStream()) { >> byte[] buffer = new byte[1024]; >> int bytesRead; >> while ((bytesRead = fis.read(buffer)) != -1) { >> out2.write(buffer, 0, bytesRead); >> } >> } >> } else { >> // Handle invalid filename pattern >> // For example: Log an error, return a response indicating >> invalid file, etc. >> } >> } >> } catch (IOException e) { >> e.printStackTrace(); >> return "error"; // Return the result name for error handling >> } >> >> return null; // To avoid Struts2 result processing >> } >> >> However I am still not able to download and view .pdf and .docx file. >> >> Kindly assist. Thank you. >> >> Regards >> >> Mahabir >> >>