Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Readme #6

Merged
merged 22 commits into from
May 8, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
22 commits
Select commit Hold shift + click to select a range
db91870
Add spring boot jpa dependency
FelixJacobsen May 6, 2022
1f0e650
Add image entity
FelixJacobsen May 6, 2022
191c8b2
Add ImageDbRepository
FelixJacobsen May 6, 2022
64b6e5d
Add FileSystemRepository with uploadImage method
FelixJacobsen May 6, 2022
4afa63d
Add method to find in file system
FelixJacobsen May 6, 2022
c1bf1cf
Add ImageService with functionality to upload images
FelixJacobsen May 6, 2022
d542357
Add download image function
FelixJacobsen May 6, 2022
b91ff73
Add ImageController with upload endpoint
FelixJacobsen May 6, 2022
0d0f778
Add download endpoint in ImageController
FelixJacobsen May 6, 2022
c379e61
Added configuration for H2DB and defined 10MB as max size for files
FelixJacobsen May 6, 2022
1cf9eb9
Removed spring-cloud dependency causing problems with running the app…
FelixJacobsen May 7, 2022
91fcd13
Change folder name from resource to resources
FelixJacobsen May 8, 2022
17f33d8
Update readme with endpoints
helenahalldiniths May 8, 2022
56b2b59
Update src/main/java/se/iths/imagestorage/repository/FileSystemReposi…
FelixJacobsen May 8, 2022
e44b5c9
Update src/main/resources/application.properties
FelixJacobsen May 8, 2022
ca78d17
Change log error
FelixJacobsen May 8, 2022
3b2c9e1
Change endpoint to /images
FelixJacobsen May 8, 2022
2f6ae64
Refactor
FelixJacobsen May 8, 2022
e60064d
Fix row 18
LordRekishi May 8, 2022
73765c0
Merge pull request #5 from Patlenlix/UploadDownloadImages
LordRekishi May 8, 2022
3a3301a
Update readme with endpoints
helenahalldiniths May 8, 2022
739199b
Merge remote-tracking branch 'origin/readme' into readme
LordRekishi May 8, 2022
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 5 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,10 @@

**Image storage** is a Spring Boot application.




## Endpoints

| HTTP-verb | URL | BODY | PRODUCES | HEADER | Info |
|-----------|-------------------|---------------------------------------------------------------------------|--------------|------------------------------------|----------------------------------------|
| POST | /images | A MultipartForm with the name "images" <br/>and the value as a .jpeg file | | Content-Type: multipart/form-data | Uploads an image |
| GET | /images/{imageId} | | A .jpeg file | | Downloads an image with id = {imageId} |
25 changes: 9 additions & 16 deletions pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,6 @@
<description>image-storage</description>
<properties>
<java.version>17</java.version>
<spring-cloud.version>2021.0.2</spring-cloud.version>
</properties>
<dependencies>
<dependency>
Expand All @@ -26,10 +25,7 @@
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-consul-discovery</artifactId>
</dependency>


<dependency>
<groupId>com.h2database</groupId>
Expand All @@ -46,24 +42,21 @@
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
<version>2.6.7</version>
<scope>compile</scope>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring-cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>


<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>2.6.7</version>
</plugin>
</plugins>
</build>
Expand Down
27 changes: 27 additions & 0 deletions src/main/java/se/iths/imagestorage/controller/ImageController.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
package se.iths.imagestorage.controller;

import org.springframework.core.io.FileSystemResource;
import org.springframework.http.MediaType;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import se.iths.imagestorage.service.ImageService;

@RestController
@RequestMapping("/images")
public class ImageController {
private final ImageService service;

public ImageController(ImageService service) {
this.service = service;
}

@PostMapping
public Long uploadImage(@RequestParam MultipartFile multipartFile){
return service.uploadImage(multipartFile);
}

@GetMapping(value = "/{id}", produces = MediaType.ALL_VALUE)
public FileSystemResource downloadImage(@PathVariable Long id){
return service.downloadImage(id);
}
}
41 changes: 41 additions & 0 deletions src/main/java/se/iths/imagestorage/entity/Image.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
package se.iths.imagestorage.entity;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;

@Entity
public class Image {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
private String path;

public Long getId() {
return id;
}

public void setId(Long id) {
this.id = id;
}

public String getName() {
return name;
}

public Image setName(String name) {
this.name = name;
return this;
}

public String getPath() {
return path;
}

public Image setPath(String path) {
this.path = path;
return this;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
package se.iths.imagestorage.repository;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.core.io.FileSystemResource;
import org.springframework.stereotype.Repository;
import org.springframework.web.multipart.MultipartFile;
import se.iths.imagestorage.entity.Image;

import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.InvalidPathException;
import java.nio.file.Path;
import java.nio.file.Paths;

@Repository
public class FileSystemRepository {
private final Logger log = LoggerFactory.getLogger(FileSystemRepository.class);

public void uploadImage(MultipartFile file, Image image){
Path path = Paths.get(image.getPath());

try {
Files.createDirectories(path.getParent());
byte[] bytes = file.getBytes();
Files.write(path, bytes);
} catch (IOException e) {
log.error("Error: {0}");
}
}

public FileSystemResource findInFileSystem(String path){
try{
return new FileSystemResource(Paths.get(path));
}catch (InvalidPathException e){
throw new RuntimeException(e);
}
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
package se.iths.imagestorage.repository;

import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;
import se.iths.imagestorage.entity.Image;

@Repository
public interface ImageDbRepository extends JpaRepository<Image, Long> {}
46 changes: 46 additions & 0 deletions src/main/java/se/iths/imagestorage/service/ImageService.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
package se.iths.imagestorage.service;


import org.springframework.core.io.FileSystemResource;
import org.springframework.http.HttpStatus;
import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.server.ResponseStatusException;
import se.iths.imagestorage.entity.Image;
import se.iths.imagestorage.repository.FileSystemRepository;
import se.iths.imagestorage.repository.ImageDbRepository;

import java.nio.file.Paths;

@Service
public class ImageService {

private final ImageDbRepository imageDbRepository;
private final FileSystemRepository fileSystemRepository;

public ImageService(ImageDbRepository imageDbRepository, FileSystemRepository fileSystemRepository) {
this.imageDbRepository = imageDbRepository;
this.fileSystemRepository = fileSystemRepository;
}

public Long uploadImage(MultipartFile imageAsFile){
Image image = new Image();
image.setName(imageAsFile.getOriginalFilename());

image.setPath(setImagePath() + imageAsFile.getOriginalFilename());
fileSystemRepository.uploadImage(imageAsFile,image);
return imageDbRepository.save(image).getId();
}

public FileSystemResource downloadImage(Long id){
Image image = imageDbRepository.findById(id)
.orElseThrow(() -> new ResponseStatusException(HttpStatus.NOT_FOUND));
return fileSystemRepository.findInFileSystem(image.getPath());
}
private String setImagePath(){
String folder = StringUtils.cleanPath(Paths.get(".").toAbsolutePath().toString());
return folder + "/src/main/resources/static/images/";
}

}
4 changes: 4 additions & 0 deletions src/main/resources/application.properties
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
spring.h2.console.enabled=true
spring.datasource.url=jdbc:h2:mem:images
spring.servlet.multipart.max-file-size=10MB
spring.servlet.multipart.max-request-size=10MB