diff --git a/pom.xml b/pom.xml index 8c57cb3..491f6df 100644 --- a/pom.xml +++ b/pom.xml @@ -15,8 +15,8 @@ UTF-8 - 1.7 - 1.7 + 17 + 17 diff --git a/src/main/java/ru/molokoin/home/servlets/Delete.java b/src/main/java/ru/molokoin/home/servlets/Delete.java new file mode 100644 index 0000000..ff0fcfa --- /dev/null +++ b/src/main/java/ru/molokoin/home/servlets/Delete.java @@ -0,0 +1,37 @@ +package ru.molokoin.home.servlets; + +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; + +import jakarta.servlet.ServletException; +import jakarta.servlet.annotation.WebServlet; +import jakarta.servlet.http.HttpServlet; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; + +/** + * Сервлет удаляющий файл из хранилища + */ +@WebServlet(name = "Delete", value = "/delete") +public class Delete extends HttpServlet{ + private String STORAGE_PATH = "/srv/apps/home/exchange"; + + @Override + protected void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException { + request.setCharacterEncoding("UTF-8"); + response.setContentType("text/html; charset=UTF-8"); + + //Узнать имя файла из запроса + String fileName = request.getParameter("filename"); + + //Удаление файла + File fileToDelete = new File(STORAGE_PATH + File.separator + fileName); + fileToDelete.delete(); + //после скачивания возвращаем пользователя в хранилище + response.sendRedirect("storage"); + } + +} diff --git a/src/main/java/ru/molokoin/home/servlets/Download.java b/src/main/java/ru/molokoin/home/servlets/Download.java new file mode 100644 index 0000000..a43947d --- /dev/null +++ b/src/main/java/ru/molokoin/home/servlets/Download.java @@ -0,0 +1,48 @@ +package ru.molokoin.home.servlets; + +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.nio.charset.StandardCharsets; + +import jakarta.servlet.ServletException; +import jakarta.servlet.annotation.WebServlet; +import jakarta.servlet.http.HttpServlet; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; +import ru.molokoin.home.util.HardDrive; + +@WebServlet(name = "Download", value = "/download") +public class Download extends HttpServlet{ + private String STORAGE_PATH = HardDrive.root; + private final int ARBITARY_SIZE = 1048;//размер буфера при чтении файла + + @Override + protected void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException { + request.setCharacterEncoding("UTF-8"); + //response.setContentType("text/html; charset=UTF-8"); + + response.setContentType("text/plain; charset=UTF-8"); + //Узнать имя файла из запроса + String fileName = request.getParameter("filename"); + response.setHeader("Content-disposition", "attachment; filename=" + fileName); + + //Отдаем файл с сервера + File file = new File(STORAGE_PATH + File.separator + fileName); + try(InputStream in = new FileInputStream(file); + OutputStream out = response.getOutputStream()) { + + byte[] buffer = new byte[ARBITARY_SIZE]; + + int numBytesRead; + while ((numBytesRead = in.read(buffer)) > 0) { + out.write(buffer, 0, numBytesRead); + } + } + //после скачивания возвращаем пользователя в хранилище + response.sendRedirect("storage"); + } + +} diff --git a/src/main/java/ru/molokoin/home/servlets/Storage.java b/src/main/java/ru/molokoin/home/servlets/Storage.java index 62e8f68..5cbc7db 100644 --- a/src/main/java/ru/molokoin/home/servlets/Storage.java +++ b/src/main/java/ru/molokoin/home/servlets/Storage.java @@ -8,7 +8,14 @@ import java.io.InputStreamReader; import java.io.PrintWriter; import java.io.Reader; import java.nio.charset.StandardCharsets; +import java.nio.file.Files; +import java.nio.file.Path; import java.nio.file.Paths; +import java.nio.file.StandardCopyOption; +import java.util.Collection; +import java.util.Set; +import java.util.stream.Collectors; +import java.util.stream.Stream; import jakarta.servlet.ServletException; import jakarta.servlet.annotation.MultipartConfig; @@ -20,11 +27,13 @@ import jakarta.servlet.http.Part; /** * Сервлет файлообменника */ -@MultipartConfig(fileSizeThreshold = 2024 * 2024, - maxFileSize = 2024 * 2024 * 5, - maxRequestSize = 2024 * 2024 * 5 * 5) +@MultipartConfig +// (fileSizeThreshold = 2024 * 2024, +// maxFileSize = 2024 * 2024 * 5, +// maxRequestSize = 2024 * 2024 * 5 * 5) @WebServlet(name = "Storage", value = "/storage") public class Storage extends HttpServlet{ + private String STORAGE_PATH = "/srv/apps/home/exchange";//TODO Путь разместить в файле настроек приложения *.property /** * Возвращает пользователю страницу, содержащую: * - перечень доступных для скачивания файлов @@ -32,11 +41,10 @@ public class Storage extends HttpServlet{ */ @Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException { - //page(request, response); request.setCharacterEncoding("UTF-8"); response.setContentType("text/html; charset=UTF-8"); - PrintWriter out = response.getWriter(); + out.println(""); out.println(""); out.println(""); @@ -52,16 +60,31 @@ public class Storage extends HttpServlet{ out.println("

molokoin.ru : storage

"); out.println(""); out.println(""); out.println("
"); - out.println("

tables of content

"); + + + + + // Отображение содержимого файла + // System.out.println("Проверка filename ..."); + // if (request.getParameter("filename") != null){ + // System.out.println(STORAGE_PATH + "/" + request.getParameter("filename")); + // out.println(""); + // } + + // Отображение списка файлов + out.println(listMain()); + out.println("
"); out.println(""); @@ -70,84 +93,116 @@ public class Storage extends HttpServlet{ @Override protected void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException { - page(request, response); + //page(request, response); + //скачивание файла + try { + upload(request); + } catch (ServletException e) { + //переслать на страницу ошибки + } + response.sendRedirect("storage"); } - private void page(HttpServletRequest request, HttpServletResponse response) throws IOException { - request.setCharacterEncoding("UTF-8"); - response.setContentType("text/html; charset=UTF-8"); - - PrintWriter out = response.getWriter(); - out.println(""); - out.println(""); - out.println(""); - out.println(" "); - out.println(" "); - out.println(" "); - out.println(" home:storage"); - // Подключение стилей - out.println(" "); - out.println(""); - out.println(""); - out.println("
"); - out.println("

molokoin.ru : storage

"); - out.println("
"); - out.println(""); - out.println("
"); - out.println("

tables of content

"); - // обработка данных - String description = request.getParameter("description"); // Retrieves - out.println("

"+description+"

"); - - String uploadPath = "/srv/apps/home/exchange"; - File uploadDir = new File(uploadPath); - if (!uploadDir.exists()) { - out.println("

"+"Директория для записи файла: " + uploadPath + " не доступна!!!" + "

"); - } else { - try { - Part filePart = request.getPart("file"); - String fileName = Paths.get(filePart.getSubmittedFileName()).getFileName().toString(); - out.println("

"+fileName+"

"); - for (Part part : request.getParts()) { - part.write(uploadPath + File.separator + fileName); - //out.println("

"+fileName + "содержит: " + part.getSize()+"

"); - } - } catch (ServletException e) { - //e.printStackTrace(); - } + /** + * Метод загружает на сервер файл выбранный пользователем, + * возвращает строку, содержащую отчет по результатам загрузки + * @param request + * @return + * @throws IOException + * @throws ServletException + */ + private Boolean upload(HttpServletRequest request) throws IOException, ServletException{ + String fileName = ""; + Part filePart = request.getPart("file"); + fileName = Paths.get(filePart.getSubmittedFileName()).getFileName().toString(); + for (Part part : request.getParts()) { + part.write(STORAGE_PATH + File.separator + fileName); } - - + return true; + } + /** + * Метод, возвращающий список файлов на сервере + * @return + * @throws IOException + */ + private Set list() throws IOException{ + Stream stream = Files.list(Paths.get(STORAGE_PATH)); + Set list = stream + .filter(file -> !Files.isDirectory(file)) + .map(Path::getFileName) + .map(Path::toString) + .collect(Collectors.toSet()); + stream.close(); + return list; + } + /** + * Метод формирует список файлов и директорий, + * для отображения на боковой панели страницы + * Инструменты управления файлами: + * - просмотр списка файлов и директорий + * - просмотр файла + * - просмотр содержимого директории + * - + * + * @return + * @throws IOException + */ + private String listSide() throws IOException{ + StringBuilder report = new StringBuilder(); + Set list = list(); + for (String filename : list) { + report.append(""); + report.append(filename); + report.append(""); + } + return report.toString(); + } - // Part filePart; - // try { - // filePart = request.getPart("file");// Retrieves - // String fileName = Paths.get(filePart.getSubmittedFileName()).getFileName().toString(); // MSIE fix. - // out.println("

" + fileName + " contains: " + "

"); - // InputStream fileContent = filePart.getInputStream(); - // //читаем из файла - // StringBuilder textBuilder = new StringBuilder(); - // try (Reader reader = new BufferedReader(new InputStreamReader - // (fileContent, StandardCharsets.UTF_8))) { - // int c = 0; - // while ((c = reader.read()) != -1) { - // textBuilder.append((char) c); - // } - // out.println("

" + fileName + " contains: " + textBuilder.toString() + "

"); - // } - // } catch (ServletException e) { - // // TODO Auto-generated catch block - // //e.printStackTrace(); - // out.println("

" + "Файл вызвал ошибку: " + "

"); - // } - out.println("
"); - out.println(""); - out.println(""); + /** + * Метод возвращает перечень доступных файлов на сервере + * - в виде таблицы + * @return + * @throws IOException + */ + private String listMain() throws IOException{ + StringBuilder report = new StringBuilder(); + Set list = list(); + //таблица - перечень файлов + report.append("

" + "Файлы на сервере: " + "

"); + report.append(""); + report.append(""); + report.append(""); + report.append(""); + report.append(""); + report.append(""); + report.append("");//скачать : удалить + report.append(""); + for(String path : list) { + report.append(""); + report.append(""); + report.append(""); + report.append(""); + report.append(""); + //добавляем кнопку скачивания + report.append(""); + report.append(""); + } + report.append("
IDНаименованиеОписаниеДата добавленияcontrols
" + "no id" +"" + path + "" + "no description" + "" + "no date" + ""); + //кнопка скачивания + report.append("
"); + report.append(" "); + report.append(" "); + report.append("
"); + report.append("
"); + //кнопка удаления + report.append("
"); + report.append(" "); + report.append(" "); + report.append("
"); + report.append("
"); + return report.toString(); } diff --git a/src/main/java/ru/molokoin/home/util/HardDrive.java b/src/main/java/ru/molokoin/home/util/HardDrive.java new file mode 100644 index 0000000..74666df --- /dev/null +++ b/src/main/java/ru/molokoin/home/util/HardDrive.java @@ -0,0 +1,76 @@ +package ru.molokoin.home.util; + +import java.io.File; +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.util.Arrays; +import java.util.HashMap; +import java.util.Set; +import java.util.stream.Collectors; +import java.util.stream.Stream; + +/** + * Методы работы с данными на жестком диске + */ +public class HardDrive { + public static String root = "/srv/apps/home/exchange"; + + public static String getRoot() { + return root; + } + public static void setRoot(String root) { + HardDrive.root = root; + } + /** + * Метод, возвращающий список файлов в корне хранилища приложения + * @return + * @throws IOException + */ + private static Set listFiles(String path) throws IOException{ + Stream stream = Files.list(Paths.get(path)); + Set list = stream + .filter(file -> !Files.isDirectory(file)) + .map(Path::getFileName) + .map(Path::toString) + .collect(Collectors.toSet()); + stream.close(); + return list; + } + + private static HashMap getMap(String path) throws IOException{ + Stream stream = Files.list(Paths.get(path)); + HashMap map = new HashMap<>(); + return map; + } + + + public static void showFiles(File[] files) { + for (File file : files) { + if (file.isDirectory()) { + System.out.println("Directory: " + file.getAbsolutePath()); + showFiles(file.listFiles()); // Calls same method again. + } else { + System.out.println("File: " + file.getAbsolutePath()); + } + } + } + + /** + * тестируем работу методов HardDrive + * @param args + */ + public static void main(String[] args) { + File dir = new File("C:\\Users\\Strannik\\Documents\\esoe\\code\\home\\src\\main\\webapp\\content"); + new File(dir + File.separator + "inner").mkdirs(); + //showFiles(dir.listFiles()); + System.out.println(Arrays.toString(dir.listFiles())); + for (File file : dir.listFiles()) { + System.out.println(file.getName()); + } + + + } + +} diff --git a/target/classes/ru/molokoin/home/entities/Media.class b/target/classes/ru/molokoin/home/entities/Media.class index 73b0785..027493b 100644 Binary files a/target/classes/ru/molokoin/home/entities/Media.class and b/target/classes/ru/molokoin/home/entities/Media.class differ diff --git a/target/classes/ru/molokoin/home/servlets/Delete.class b/target/classes/ru/molokoin/home/servlets/Delete.class new file mode 100644 index 0000000..51be8b8 Binary files /dev/null and b/target/classes/ru/molokoin/home/servlets/Delete.class differ diff --git a/target/classes/ru/molokoin/home/servlets/Download.class b/target/classes/ru/molokoin/home/servlets/Download.class new file mode 100644 index 0000000..fbdd120 Binary files /dev/null and b/target/classes/ru/molokoin/home/servlets/Download.class differ diff --git a/target/classes/ru/molokoin/home/servlets/Main.class b/target/classes/ru/molokoin/home/servlets/Main.class index 41ae768..c541216 100644 Binary files a/target/classes/ru/molokoin/home/servlets/Main.class and b/target/classes/ru/molokoin/home/servlets/Main.class differ diff --git a/target/classes/ru/molokoin/home/servlets/Storage.class b/target/classes/ru/molokoin/home/servlets/Storage.class index 668eb2e..f835d64 100644 Binary files a/target/classes/ru/molokoin/home/servlets/Storage.class and b/target/classes/ru/molokoin/home/servlets/Storage.class differ diff --git a/target/classes/ru/molokoin/home/util/HardDrive.class b/target/classes/ru/molokoin/home/util/HardDrive.class new file mode 100644 index 0000000..381482f Binary files /dev/null and b/target/classes/ru/molokoin/home/util/HardDrive.class differ diff --git a/target/home.war b/target/home.war index e5f0826..79f4ee8 100644 Binary files a/target/home.war and b/target/home.war differ diff --git a/target/home/WEB-INF/classes/ru/molokoin/home/entities/Media.class b/target/home/WEB-INF/classes/ru/molokoin/home/entities/Media.class index 73b0785..027493b 100644 Binary files a/target/home/WEB-INF/classes/ru/molokoin/home/entities/Media.class and b/target/home/WEB-INF/classes/ru/molokoin/home/entities/Media.class differ diff --git a/target/home/WEB-INF/classes/ru/molokoin/home/servlets/Delete.class b/target/home/WEB-INF/classes/ru/molokoin/home/servlets/Delete.class new file mode 100644 index 0000000..51be8b8 Binary files /dev/null and b/target/home/WEB-INF/classes/ru/molokoin/home/servlets/Delete.class differ diff --git a/target/home/WEB-INF/classes/ru/molokoin/home/servlets/Download.class b/target/home/WEB-INF/classes/ru/molokoin/home/servlets/Download.class new file mode 100644 index 0000000..fbdd120 Binary files /dev/null and b/target/home/WEB-INF/classes/ru/molokoin/home/servlets/Download.class differ diff --git a/target/home/WEB-INF/classes/ru/molokoin/home/servlets/Main.class b/target/home/WEB-INF/classes/ru/molokoin/home/servlets/Main.class index 41ae768..c541216 100644 Binary files a/target/home/WEB-INF/classes/ru/molokoin/home/servlets/Main.class and b/target/home/WEB-INF/classes/ru/molokoin/home/servlets/Main.class differ diff --git a/target/home/WEB-INF/classes/ru/molokoin/home/servlets/Storage.class b/target/home/WEB-INF/classes/ru/molokoin/home/servlets/Storage.class index 668eb2e..f835d64 100644 Binary files a/target/home/WEB-INF/classes/ru/molokoin/home/servlets/Storage.class and b/target/home/WEB-INF/classes/ru/molokoin/home/servlets/Storage.class differ diff --git a/target/home/WEB-INF/classes/ru/molokoin/home/util/HardDrive.class b/target/home/WEB-INF/classes/ru/molokoin/home/util/HardDrive.class new file mode 100644 index 0000000..381482f Binary files /dev/null and b/target/home/WEB-INF/classes/ru/molokoin/home/util/HardDrive.class differ diff --git a/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst b/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst index 964659c..323eda0 100644 --- a/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst +++ b/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst @@ -1,3 +1,6 @@ ru\molokoin\home\servlets\Storage.class ru\molokoin\home\entities\Media.class +ru\molokoin\home\servlets\Delete.class ru\molokoin\home\servlets\Main.class +ru\molokoin\home\util\HardDrive.class +ru\molokoin\home\servlets\Download.class diff --git a/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst b/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst index f511928..5b6f242 100644 --- a/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst +++ b/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst @@ -1,3 +1,6 @@ C:\Users\Strannik\Documents\esoe\code\home\src\main\java\ru\molokoin\home\servlets\Storage.java C:\Users\Strannik\Documents\esoe\code\home\src\main\java\ru\molokoin\home\entities\Media.java +C:\Users\Strannik\Documents\esoe\code\home\src\main\java\ru\molokoin\home\servlets\Download.java +C:\Users\Strannik\Documents\esoe\code\home\src\main\java\ru\molokoin\home\servlets\Delete.java C:\Users\Strannik\Documents\esoe\code\home\src\main\java\ru\molokoin\home\servlets\Main.java +C:\Users\Strannik\Documents\esoe\code\home\src\main\java\ru\molokoin\home\util\HardDrive.java