Commit 09bcd4a6 by Patryk Czarnik

Upload plików na przykładzie zdjęcia produktu

parent c9e6f119
package sklep.photo;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.MultipartConfig;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.Part;
// Włączona obsługa zapytań multipart ("z załącznikami"). Maks rozmiar zapytania/pliku: 16M
@WebServlet("/DoUploadPhoto")
@MultipartConfig(maxRequestSize = 16 * 1024 * 1024)
public class DoUploadPhoto extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
try {
String paramId = request.getParameter("productId");
if(paramId != null) {
int productId = Integer.parseInt(paramId);
Part part = request.getPart("plik");
if(part != null) {
// przysłano plik
// Tutaj nazwa pliku jest dla nas bez znaczenia, ale gdybyśmy potrzebowali, to w ten sposób:
// String nazwaPliku = part.getSubmittedFileName();
// Przypisujemy bajty ze strumienia do pliku w katalogu ze zdjęciami:
PhotoUtil.writeStream(productId, part.getInputStream());
}
}
} catch (Exception e) {
// wypisujemy błąd, ale metoda kończy się normalnie
e.printStackTrace();
}
response.sendRedirect("products9.jsp");
}
}
...@@ -2,9 +2,11 @@ package sklep.photo; ...@@ -2,9 +2,11 @@ package sklep.photo;
import java.io.File; import java.io.File;
import java.io.IOException; import java.io.IOException;
import java.io.InputStream;
import java.nio.file.Files; import java.nio.file.Files;
import java.nio.file.Path; import java.nio.file.Path;
import java.nio.file.Paths; import java.nio.file.Paths;
import java.nio.file.StandardCopyOption;
import sklep.db.DBException; import sklep.db.DBException;
import sklep.db.DBSettings; import sklep.db.DBSettings;
...@@ -34,10 +36,20 @@ public class PhotoUtil { ...@@ -34,10 +36,20 @@ public class PhotoUtil {
} }
} }
private static Path getPath(int productId) throws DBException { public static void writeStream(int productId, InputStream inputStream) {
String dir = DBSettings.load().getProperty("photo_dir"); try {
String fileName = productId + EXT; Path path = getPath(productId);
return Paths.get(dir, fileName); Files.copy(inputStream, path, StandardCopyOption.REPLACE_EXISTING);
} } catch (Exception e) {
// wypisujemy błąd, ale metoda kończy się normalnie
e.printStackTrace();
}
}
private static Path getPath(int productId) throws DBException {
String dir = DBSettings.load().getProperty("photo_dir");
String fileName = productId + EXT;
return Paths.get(dir, fileName);
}
} }
...@@ -29,7 +29,8 @@ ...@@ -29,7 +29,8 @@
<h3>Dodatkowe strony</h3> <h3>Dodatkowe strony</h3>
<ul> <ul>
<li><a href="Photo?productId=1">Foto</a> - przykładowe zdjęcie</li> <li><a href="Photo?productId=2">Foto</a> - przykładowe zdjęcie</li>
<li><a href="upload_photo.jsp?productId=2">Zmień zdjęcie</a> nr 2</li>
<li><a href="EditProduct?productId=1">Edytuj produkt nr 1</a></li> <li><a href="EditProduct?productId=1">Edytuj produkt nr 1</a></li>
<li><a href="EditProduct">Dodaj nowy produkt</a></li> <li><a href="EditProduct">Dodaj nowy produkt</a></li>
</ul> </ul>
......
...@@ -59,6 +59,7 @@ do ${param.max_price} ...@@ -59,6 +59,7 @@ do ${param.max_price}
</c:if> </c:if>
<div><a href="AddToBasket?productId=${p.productId}">dodaj do koszyka</a></div> <div><a href="AddToBasket?productId=${p.productId}">dodaj do koszyka</a></div>
<div><a href="EditProduct?productId=${p.productId}">edytuj</a></div> <div><a href="EditProduct?productId=${p.productId}">edytuj</a></div>
<div><a href="upload_photo.jsp?productId=${p.productId}">zmień zdjęcie</a></div>
</div> </div>
</c:forEach> </c:forEach>
......
<%@page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Edycja zdjęcia</title>
<link rel="stylesheet" type="text/css" href="styl.css">
</head>
<body>
<h1>Wgraj zdjęcie produktu</h1>
<div>Produkt nr <strong>${param.productId}</strong></div>
<div>Aktualne zdjęcie:<br/>
<img src="Photo?productId=${param.productId}" alt="Brak zdjęcia">
</div>
<%-- action powoduje, że zapytanie z formularza jest wysyłane pod podany adres, a nie bieżący.
Aby wysłać zawartość pliku (a nie tylko jego nazwę), należy ustawić enctype jak poniżej.
Sam plik to pole formularza typu file; oprócz niego mogą być inne zwykłe pola.
Odpowiednio trzeba to też obsłużyć w serwlecie - patrz klasa DoUploadPhoto.
--%>
<form id="photo-form" method="post" action="DoUploadPhoto" enctype="multipart/form-data">
<input type="hidden" name="productId" value="${param.productId}">
<label for="plik">Wybierz plik ze zdjęciem</label>
<input type="file" name="plik" accept="image/jpeg">
<br>
<button>Wyślij</button>
</form>
<p>[<a href="products9.jsp">powrót do listy produktów</a>]</p>
<p>[<a href="index.html">powrót do spisu treści</a>]</p>
</body>
</html>
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment