added feature to change an article image

This commit is contained in:
Hendrik Schutter 2020-05-23 14:18:33 +02:00
parent fcdf0e776d
commit 620e163a14
6 changed files with 57 additions and 20 deletions

View File

@ -3,10 +3,16 @@ package org.hso.ecommerce.controller.intern;
import java.awt.image.BufferedImage; import java.awt.image.BufferedImage;
import java.io.File; import java.io.File;
import java.io.IOException; import java.io.IOException;
import java.io.OutputStream;
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.Optional; import java.util.Optional;
import javax.imageio.ImageIO; import javax.imageio.ImageIO;
import org.hso.ecommerce.entities.shop.Article; import org.hso.ecommerce.entities.shop.Article;
@ -19,9 +25,12 @@ import org.hso.ecommerce.repos.shop.ImageRepository;
import org.hso.ecommerce.repos.shop.OffersRepository; import org.hso.ecommerce.repos.shop.OffersRepository;
import org.hso.ecommerce.repos.warehouse.WarehouseBookingPositionSlotEntryRepository; import org.hso.ecommerce.repos.warehouse.WarehouseBookingPositionSlotEntryRepository;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.crypto.bcrypt.BCrypt;
import org.springframework.stereotype.Controller; import org.springframework.stereotype.Controller;
import org.springframework.ui.Model; import org.springframework.ui.Model;
import org.springframework.util.DigestUtils;
import org.springframework.web.bind.annotation.*; import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.servlet.view.RedirectView; import org.springframework.web.servlet.view.RedirectView;
@Controller @Controller
@ -80,12 +89,11 @@ public class InternArticleController {
@RequestParam(value = "price_netto", required = true) String pricenetto, @RequestParam(value = "price_netto", required = true) String pricenetto,
@RequestParam(value = "reorderMaxPrice", required = true) String reorderMaxPrice, @RequestParam(value = "reorderMaxPrice", required = true) String reorderMaxPrice,
@RequestParam(value = "autobuy", required = true) Boolean shouldReorder, @RequestParam(value = "autobuy", required = true) Boolean shouldReorder,
@RequestParam(value = "categories", required = true) String categories) { @RequestParam(value = "categories", required = true) String categories,
@RequestParam(value = "img", required = true) MultipartFile imgFile) {
Article tmpArticle = articleRepository.findArticleById(id); // get the old article Article tmpArticle = articleRepository.findArticleById(id); // get the old article
// TODO img
String[] separatedCategories = categories.split("\n"); String[] separatedCategories = categories.split("\n");
tmpArticle.categories.clear(); tmpArticle.categories.clear();
@ -102,6 +110,7 @@ public class InternArticleController {
tmpArticle.shopPricePerUnitNetCent = (int) (Float.parseFloat(pricenetto) * 100); tmpArticle.shopPricePerUnitNetCent = (int) (Float.parseFloat(pricenetto) * 100);
tmpArticle.warehouseUnitsPerSlot = Integer.parseInt(warehouseUnitsPerSlot); tmpArticle.warehouseUnitsPerSlot = Integer.parseInt(warehouseUnitsPerSlot);
tmpArticle.title = title; tmpArticle.title = title;
updateImage(tmpArticle, imgFile);
tmpArticle.description = description; tmpArticle.description = description;
articleRepository.save(tmpArticle); // save updated article articleRepository.save(tmpArticle); // save updated article
@ -133,30 +142,56 @@ public class InternArticleController {
return new RedirectView("../" + articleRepository.findArticleIDByRelatedID(offeredArticleID).get()); return new RedirectView("../" + articleRepository.findArticleIDByRelatedID(offeredArticleID).get());
} }
private void setDefaultImage(Article tmpArticle) { private void setDefaultImage(Article article) {
String defaultImagePath = "./data/img/no_product_img.jpg"; // path + name of default img String defaultImagePath = "./data/img/no_product_img.jpg"; // path + name of default img
Optional<Integer> imageID = imageRepository.findImageByPath(defaultImagePath); // get default img Optional<Integer> imageID = imageRepository.findImageIDByPath(defaultImagePath); // get default img
if (imageID.isPresent()) { if (imageID.isPresent()) {
// default img is in DB // default img is in DB
tmpArticle.image = imageRepository.findImageById(imageID.get()); // set default img to new article article.image = imageRepository.findImageById(imageID.get()); // set default img to new article
} else { } else {
//default img is not in DB // default img is not in DB
File tmpFile = new File(defaultImagePath); File tmpFile = new File(defaultImagePath);
//test if default img file exits // test if default img file exits
if (!tmpFile.exists()) { if (!tmpFile.exists()) {
//fallback if the file not exists // fallback if the file not exists
BufferedImage bufferedImage = new BufferedImage(422, 428, BufferedImage.TYPE_INT_RGB); //create new file // create new file
BufferedImage bufferedImage = new BufferedImage(422, 428, BufferedImage.TYPE_INT_RGB);
try { try {
ImageIO.write(bufferedImage, "jpg", new File(defaultImagePath)); //save new file on disk ImageIO.write(bufferedImage, "jpg", new File(defaultImagePath)); // save new file on disk
} catch (IOException e) { } catch (IOException e) {
e.printStackTrace(); e.printStackTrace();
} }
} }
Image defaultImage = new Image(); Image defaultImage = new Image();
defaultImage.path = defaultImagePath; //set new file to default img defaultImage.path = defaultImagePath; // set new file to default img
imageRepository.save(defaultImage); //save default img imageRepository.save(defaultImage); // save default img
tmpArticle.image = defaultImage; //set default img to new article article.image = defaultImage; // set default img to new article
}
}
private void updateImage(Article article, MultipartFile imgFile) {
// check if a file is present
if (imgFile.getSize() > 0) {
try {
// get file name based on MD5 hash
String fileName = DigestUtils.md5DigestAsHex(imgFile.getBytes()) + ".jpg";
// check if img is already in system
Optional<Integer> imageID = imageRepository.findImageIDByPath("./data/img/" + fileName);
if (imageID.isPresent()) {
article.image = imageRepository.findImageById(imageID.get()); // add existing img to article
} else {
// write new img file to disk
Files.newOutputStream(Paths.get("./data/img/", fileName)).write(imgFile.getBytes());
// create new img
Image newImage = new Image();
newImage.path = "./data/img/" + fileName; // set new file to new img
imageRepository.save(newImage); // save new img
article.image = newImage; // set new img to article
}
} catch (Exception e) {
setDefaultImage(article); // if upload failed, reset to default img
}
} }
} }

View File

@ -12,7 +12,7 @@ import java.util.Optional;
public interface ImageRepository extends JpaRepository<Image, Long> { public interface ImageRepository extends JpaRepository<Image, Long> {
@Query("SELECT i.id FROM Image i WHERE i.path = :path") @Query("SELECT i.id FROM Image i WHERE i.path = :path")
Optional<Integer> findImageByPath(@Param("path") String path); Optional<Integer> findImageIDByPath(@Param("path") String path);
@Query("SELECT i FROM Image i WHERE i.id = :imageId") @Query("SELECT i FROM Image i WHERE i.id = :imageId")
Image findImageById(@Param("imageId") long imageId); Image findImageById(@Param("imageId") long imageId);

View File

@ -16,6 +16,8 @@ spring.jpa.show-sql=true
#server.servlet.session.persistent=true #server.servlet.session.persistent=true
# ---------------------------------------- # ----------------------------------------
# WEB PROPERTIES # WEB PROPERTIES
spring.servlet.multipart.max-file-size=10MB
spring.servlet.multipart.max-request-size=10MB
# ---------------------------------------- # ----------------------------------------
# EMBEDDED SERVER CONFIGURATION (ServerProperties) # EMBEDDED SERVER CONFIGURATION (ServerProperties)
server.address=::1 server.address=::1

View File

@ -278,7 +278,7 @@ img.s {
} }
img.m { img.m {
width: var(--u8); width: 20rem;
} }
/* /*

View File

@ -24,7 +24,7 @@
<form class="detailgrid" action="#" th:action="@{/intern/articles/{id}/saveChanges(id = ${ArticleID.id})}" th:object="${ArticleID}" method="POST" enctype="multipart/form-data"> <form class="detailgrid" action="#" th:action="@{/intern/articles/{id}/saveChanges(id = ${ArticleID.id})}" th:object="${ArticleID}" method="POST" enctype="multipart/form-data">
<p class="m"> <p class="m">
<label for="title">Titel</label> <label for="title">Titel</label>
<input class=" full-width" type="text" id="title" name="title" th:value="${ArticleID.title}"/> <input class=" full-width" type="text" id="title" name="title" required="required" pattern="[A-Za-z0-9]{1,20}" th:value="${ArticleID.title}"/>
</p> </p>
<p class="s"> <p class="s">
<label for="ref-article">Refernzierter Artikel</label> <label for="ref-article">Refernzierter Artikel</label>

View File

@ -53,7 +53,7 @@
<td><span th:text="${article.price_netto}"></span></td> <td><span th:text="${article.price_netto}"></span></td>
<td><span th:text="${article.categorie}"></span></td> <td><span th:text="${article.categorie}"></span></td>
<td><span th:text="${article.stock}"></span></td> <td><span th:text="${article.stock}"></span></td>
<td><a th:href="${'/intern/supplierOffers/#q=' + {article.id}}" th:text="${article.offer_id}"></a></td> <td><a th:href="${'/intern/supplierOffers/#q=' + {article.title}}" th:text="${article.offer_id}"></a></td>
<td><a th:href="@{/intern/articles/{id}(id = ${article.id})}" th:text="${article.id}"></a></td> <td><a th:href="@{/intern/articles/{id}(id = ${article.id})}" th:text="${article.id}"></a></td>
<td> <td>
<form th:action="@{/intern/articles/{id}(id = ${article.id})}"><input type="submit" value="Bearbeiten" /></form> <form th:action="@{/intern/articles/{id}(id = ${article.id})}"><input type="submit" value="Bearbeiten" /></form>