Dalam tutorial ini, saya akan menunjukkan cara mengunggah dan mengunduh file ke/dari database dengan Spring Boot Rest API. Kami juga menggunakan antarmuka Spring Web <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <scope>runtime</scope> </dependency> 3 untuk menangani permintaan multi-bagian HTTP
Aplikasi Spring Boot ini bekerja dengan
– Sudut 8 / Sudut 10 / Sudut 11 / Sudut 12 / Sudut 13 / Sudut 14
– Bahan Sudut 12
– Klien Vue / Klien Vuetify
– React Client / React Hooks Client
– Klien Material UI
– Klien Axios
Pos terkait
– Cara mengunggah banyak file di Java Spring Boot
– Sepatu Musim Semi. Unggah/Impor data file Excel ke dalam Database MySQL
– Sepatu Musim Semi. Unggah/Impor data file CSV ke Database MySQL
Penyebaran
– Menerapkan Aplikasi Spring Boot di AWS – Elastic Beanstalk
– Komposisi Docker. Contoh Spring Boot dan MySQL
Isi
Spring Boot Rest API untuk mengunggah File ke Database
Aplikasi Spring Boot kami akan menyediakan API untuk
- mengunggah File ke database PostgreSQL/MySQL
- mengunduh basis data File dengan tautan
- mendapatkan daftar informasi File (nama file, url, jenis, ukuran)
Ini adalah API yang akan diekspor
MethodsUrlsActionsPOST/uploadupload FileGET/filesdapatkan Daftar File (nama, url, jenis, ukuran)GET/files/[fileId]download File
File yang diunggah akan disimpan di tabel file Database PostgreSQL/MySQL dengan bidang-bidang ini. <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <scope>runtime</scope> </dependency> 4, <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <scope>runtime</scope> </dependency> 5, <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <scope>runtime</scope> </dependency> 6 dan <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <scope>runtime</scope> </dependency> 7 sebagai tipe BLOB (Binary Large Object adalah untuk menyimpan data biner seperti file, gambar, audio, atau video)
Teknologi
- Jawa 8
- Spring Boot 2 (dengan Spring Web MVC)
- Database PostgreSQL/MySQL
- Maven 3. 6. 1
Struktur Proyek
Izinkan saya menjelaskannya secara singkat
– <dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
8 adalah model data yang sesuai dengan tabel file dalam database
– <dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
9 memperluas Spring Data <dependency>
<groupId>org.postgresql</groupId>
<artifactId>postgresql</artifactId>
<scope>runtime</scope>
</dependency>
0 yang memiliki metode untuk menyimpan dan mengambil file
– <dependency>
<groupId>org.postgresql</groupId>
<artifactId>postgresql</artifactId>
<scope>runtime</scope>
</dependency>
1 menggunakan <dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
9 untuk menyediakan metode untuk menyimpan file baru, mendapatkan file dengan id, mendapatkan daftar File
– <dependency>
<groupId>org.postgresql</groupId>
<artifactId>postgresql</artifactId>
<scope>runtime</scope>
</dependency>
_3 menggunakan <dependency>
<groupId>org.postgresql</groupId>
<artifactId>postgresql</artifactId>
<scope>runtime</scope>
</dependency>
1 untuk mengekspor Rest API. POST file, DAPATKAN semua informasi file, unduh File
– <dependency>
<groupId>org.postgresql</groupId>
<artifactId>postgresql</artifactId>
<scope>runtime</scope>
</dependency>
5 menangani pengecualian saat pengontrol memproses unggahan file
– <dependency>
<groupId>org.postgresql</groupId>
<artifactId>postgresql</artifactId>
<scope>runtime</scope>
</dependency>
_6 berisi informasi file (nama, url, jenis, ukuran) untuk payload respons HTTP
– aplikasi. properties berisi konfigurasi untuk koneksi database Servlet Multipart dan PostgreSQL/MySQL
– pom. xml untuk Spring Boot, Spring Data JPA dan ketergantungan konektor PostgreSQL/MySQL
Siapkan proyek Boot Musim Semi
Gunakan alat web Spring atau alat pengembangan Anda (Spring Tool Suite, Eclipse, Intellij) untuk membuat proyek Spring Boot
Kemudian buka pom. xml dan tambahkan dependensi ini
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jpa</artifactId> </dependency>Kita juga perlu menambahkan satu dependensi lagi
– Jika Anda ingin menggunakan MySQL
– atau PostgreSQL
<dependency> <groupId>org.postgresql</groupId> <artifactId>postgresql</artifactId> <scope>runtime</scope> </dependency>Buat Model Data
Model Data ini untuk menyimpan Data File. Ada empat lapangan
- <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <scope>runtime</scope> </dependency> _4. secara otomatis dihasilkan sebagai UUID
- <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <scope>runtime</scope> </dependency> 5. nama berkas
- <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <scope>runtime</scope> </dependency> _6. tipe pantomim
- <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <scope>runtime</scope> </dependency> _7. array byte, petakan ke BLOB
model/FileDB. Jawa
package com.bezkoder.spring.files.upload.db.model; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.Id; import javax.persistence.Lob; import javax.persistence.Table; import org.hibernate.annotations.GenericGenerator; @Entity @Table(name = "files") public class FileDB { @Id @GeneratedValue(generator = "uuid") @GenericGenerator(name = "uuid", strategy = "uuid2") private String id; private String name; private String type; @Lob private byte[] data; public FileDB() { } public FileDB(String name, String type, byte[] data) { this.name = name; this.type = type; this.data = data; } public String getId() { return id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getType() { return type; } public void setType(String type) { this.type = type; } public byte[] getData() { return data; } public void setData(byte[] data) { this.data = data; } }Pada kode di atas, <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <scope>runtime</scope> </dependency> _7 dianotasi oleh package com.bezkoder.spring.files.upload.db.model; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.Id; import javax.persistence.Lob; import javax.persistence.Table; import org.hibernate.annotations.GenericGenerator; @Entity @Table(name = "files") public class FileDB { @Id @GeneratedValue(generator = "uuid") @GenericGenerator(name = "uuid", strategy = "uuid2") private String id; private String name; private String type; @Lob private byte[] data; public FileDB() { } public FileDB(String name, String type, byte[] data) { this.name = name; this.type = type; this.data = data; } public String getId() { return id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getType() { return type; } public void setType(String type) { this.type = type; } public byte[] getData() { return data; } public void setData(byte[] data) { this.data = data; } } 2 anotasi. LOB adalah tipe data untuk menyimpan data objek besar. Ada dua jenis LOB. BLOB dan KLOB
- BLOB adalah untuk menyimpan data biner
- CLOB adalah untuk menyimpan data teks
Buat Repositori
Di bawah paket repositori, buat antarmuka <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <scope>runtime</scope> </dependency> _9 yang memperluas <dependency> <groupId>org.postgresql</groupId> <artifactId>postgresql</artifactId> <scope>runtime</scope> </dependency> 0
repositori/FileDBRepositori. Jawa
package com.bezkoder.spring.files.upload.db.repository; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.stereotype.Repository; import com.bezkoder.spring.files.upload.db.model.FileDB; @Repository public interface FileDBRepository extends JpaRepository<FileDB, String> { }Sekarang kita dapat menggunakan <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <scope>runtime</scope> </dependency> _9 dengan metode <dependency> <groupId>org.postgresql</groupId> <artifactId>postgresql</artifactId> <scope>runtime</scope> </dependency> 0 seperti. package com.bezkoder.spring.files.upload.db.model; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.Id; import javax.persistence.Lob; import javax.persistence.Table; import org.hibernate.annotations.GenericGenerator; @Entity @Table(name = "files") public class FileDB { @Id @GeneratedValue(generator = "uuid") @GenericGenerator(name = "uuid", strategy = "uuid2") private String id; private String name; private String type; @Lob private byte[] data; public FileDB() { } public FileDB(String name, String type, byte[] data) { this.name = name; this.type = type; this.data = data; } public String getId() { return id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getType() { return type; } public void setType(String type) { this.type = type; } public byte[] getData() { return data; } public void setData(byte[] data) { this.data = data; } } 7, package com.bezkoder.spring.files.upload.db.model; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.Id; import javax.persistence.Lob; import javax.persistence.Table; import org.hibernate.annotations.GenericGenerator; @Entity @Table(name = "files") public class FileDB { @Id @GeneratedValue(generator = "uuid") @GenericGenerator(name = "uuid", strategy = "uuid2") private String id; private String name; private String type; @Lob private byte[] data; public FileDB() { } public FileDB(String name, String type, byte[] data) { this.name = name; this.type = type; this.data = data; } public String getId() { return id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getType() { return type; } public void setType(String type) { this.type = type; } public byte[] getData() { return data; } public void setData(byte[] data) { this.data = data; } } 8, package com.bezkoder.spring.files.upload.db.model; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.Id; import javax.persistence.Lob; import javax.persistence.Table; import org.hibernate.annotations.GenericGenerator; @Entity @Table(name = "files") public class FileDB { @Id @GeneratedValue(generator = "uuid") @GenericGenerator(name = "uuid", strategy = "uuid2") private String id; private String name; private String type; @Lob private byte[] data; public FileDB() { } public FileDB(String name, String type, byte[] data) { this.name = name; this.type = type; this.data = data; } public String getId() { return id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getType() { return type; } public void setType(String type) { this.type = type; } public byte[] getData() { return data; } public void setData(byte[] data) { this.data = data; } } 9
Buat Layanan untuk Penyimpanan File
Layanan Penyimpanan File akan menggunakan <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <scope>runtime</scope> </dependency> _9 untuk menyediakan metode berikut
- package com.bezkoder.spring.files.upload.db.repository; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.stereotype.Repository; import com.bezkoder.spring.files.upload.db.model.FileDB; @Repository public interface FileDBRepository extends JpaRepository<FileDB, String> { } 1. menerima objek <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <scope>runtime</scope> </dependency> 3, ubah ke objek <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <scope>runtime</scope> </dependency> 8 dan simpan ke Database
- package com.bezkoder.spring.files.upload.db.repository; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.stereotype.Repository; import com.bezkoder.spring.files.upload.db.model.FileDB; @Repository public interface FileDBRepository extends JpaRepository<FileDB, String> { } 4. mengembalikan objek <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <scope>runtime</scope> </dependency> _8 dengan Id yang diberikan
- package com.bezkoder.spring.files.upload.db.repository; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.stereotype.Repository; import com.bezkoder.spring.files.upload.db.model.FileDB; @Repository public interface FileDBRepository extends JpaRepository<FileDB, String> { } 6. mengembalikan semua file yang disimpan sebagai daftar kode> objek FileDB
layanan/Layanan Penyimpanan File. Jawa
package com.bezkoder.spring.files.upload.db.service; import java.io.IOException; import java.util.stream.Stream; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.util.StringUtils; import org.springframework.web.multipart.MultipartFile; import com.bezkoder.spring.files.upload.db.model.FileDB; import com.bezkoder.spring.files.upload.db.repository.FileDBRepository; @Service public class FileStorageService { @Autowired private FileDBRepository fileDBRepository; public FileDB store(MultipartFile file) throws IOException { String fileName = StringUtils.cleanPath(file.getOriginalFilename()); FileDB FileDB = new FileDB(fileName, file.getContentType(), file.getBytes()); return fileDBRepository.save(FileDB); } public FileDB getFile(String id) { return fileDBRepository.findById(id).get(); } public Stream<FileDB> getAllFiles() { return fileDBRepository.findAll().stream(); } }Tentukan Kelas Informasi Respons
Mari buat dua kelas dalam paket pesan. Pengontrol akan menggunakan kelas-kelas ini untuk mengirim pesan melalui respons HTTP
- <dependency> <groupId>org.postgresql</groupId> <artifactId>postgresql</artifactId> <scope>runtime</scope> </dependency> 6. berisi nama, url, jenis, ukuran
- package com.bezkoder.spring.files.upload.db.repository; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.stereotype.Repository; import com.bezkoder.spring.files.upload.db.model.FileDB; @Repository public interface FileDBRepository extends JpaRepository<FileDB, String> { } 8 untuk pesan pemberitahuan/informasi
pesan/Respon File. Jawa
package com.bezkoder.spring.files.upload.db.message; public class ResponseFile { private String name; private String url; private String type; private long size; public ResponseFile(String name, String url, String type, long size) { this.name = name; this.url = url; this.type = type; this.size = size; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getUrl() { return url; } public void setUrl(String url) { this.url = url; } public String getType() { return type; } public void setType(String type) { this.type = type; } public long getSize() { return size; } public void setSize(long size) { this.size = size; } }pesan/ResponseMessage. Jawa
package com.bezkoder.spring.files.upload.db.message; public class ResponseMessage { private String message; public ResponseMessage(String message) { this.message = message; } public String getMessage() { return message; } public void setMessage(String message) { this.message = message; } }Buat Pengontrol untuk mengunggah & mengunduh File ke Database
Dalam paket pengontrol, kami membuat kelas ________26______9
pengontrol/Pengontrol File. Jawa
package com.bezkoder.spring.files.upload.db.controller; import java.util.List; import java.util.stream.Collectors; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.HttpHeaders; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.CrossOrigin; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.multipart.MultipartFile; import org.springframework.web.servlet.support.ServletUriComponentsBuilder; import com.bezkoder.spring.files.upload.db.service.FileStorageService; import com.bezkoder.spring.files.upload.db.message.ResponseFile; import com.bezkoder.spring.files.upload.db.message.ResponseMessage; import com.bezkoder.spring.files.upload.db.model.FileDB; @Controller @CrossOrigin("//localhost:8081") public class FileController { @Autowired private FileStorageService storageService; @PostMapping("/upload") public ResponseEntity<ResponseMessage> uploadFile(@RequestParam("file") MultipartFile file) { String message = ""; try { storageService.store(file); message = "Uploaded the file successfully: " + file.getOriginalFilename(); return ResponseEntity.status(HttpStatus.OK).body(new ResponseMessage(message)); } catch (Exception e) { message = "Could not upload the file: " + file.getOriginalFilename() + "!"; return ResponseEntity.status(HttpStatus.EXPECTATION_FAILED).body(new ResponseMessage(message)); } } @GetMapping("/files") public ResponseEntity<List<ResponseFile>> getListFiles() { List<ResponseFile> files = storageService.getAllFiles().map(dbFile -> { String fileDownloadUri = ServletUriComponentsBuilder .fromCurrentContextPath() .path("/files/") .path(dbFile.getId()) .toUriString(); return new ResponseFile( dbFile.getName(), fileDownloadUri, dbFile.getType(), dbFile.getData().length); }).collect(Collectors.toList()); return ResponseEntity.status(HttpStatus.OK).body(files); } @GetMapping("/files/{id}") public ResponseEntity<byte[]> getFile(@PathVariable String id) { FileDB fileDB = storageService.getFile(id); return ResponseEntity.ok() .header(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=\"" + fileDB.getName() + "\"") .body(fileDB.getData()); } }– package com.bezkoder.spring.files.upload.db.service;
import java.io.IOException;
import java.util.stream.Stream;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;
import org.springframework.web.multipart.MultipartFile;
import com.bezkoder.spring.files.upload.db.model.FileDB;
import com.bezkoder.spring.files.upload.db.repository.FileDBRepository;
@Service
public class FileStorageService {
@Autowired
private FileDBRepository fileDBRepository;
public FileDB store(MultipartFile file) throws IOException {
String fileName = StringUtils.cleanPath(file.getOriginalFilename());
FileDB FileDB = new FileDB(fileName, file.getContentType(), file.getBytes());
return fileDBRepository.save(FileDB);
}
public FileDB getFile(String id) {
return fileDBRepository.findById(id).get();
}
public Stream<FileDB> getAllFiles() {
return fileDBRepository.findAll().stream();
}
}
_0 adalah untuk mengonfigurasi asal yang diizinkan
– package com.bezkoder.spring.files.upload.db.service;
import java.io.IOException;
import java.util.stream.Stream;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;
import org.springframework.web.multipart.MultipartFile;
import com.bezkoder.spring.files.upload.db.model.FileDB;
import com.bezkoder.spring.files.upload.db.repository.FileDBRepository;
@Service
public class FileStorageService {
@Autowired
private FileDBRepository fileDBRepository;
public FileDB store(MultipartFile file) throws IOException {
String fileName = StringUtils.cleanPath(file.getOriginalFilename());
FileDB FileDB = new FileDB(fileName, file.getContentType(), file.getBytes());
return fileDBRepository.save(FileDB);
}
public FileDB getFile(String id) {
return fileDBRepository.findById(id).get();
}
public Stream<FileDB> getAllFiles() {
return fileDBRepository.findAll().stream();
}
}
_1 anotasi digunakan untuk mendefinisikan controller
– package com.bezkoder.spring.files.upload.db.service;
import java.io.IOException;
import java.util.stream.Stream;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;
import org.springframework.web.multipart.MultipartFile;
import com.bezkoder.spring.files.upload.db.model.FileDB;
import com.bezkoder.spring.files.upload.db.repository.FileDBRepository;
@Service
public class FileStorageService {
@Autowired
private FileDBRepository fileDBRepository;
public FileDB store(MultipartFile file) throws IOException {
String fileName = StringUtils.cleanPath(file.getOriginalFilename());
FileDB FileDB = new FileDB(fileName, file.getContentType(), file.getBytes());
return fileDBRepository.save(FileDB);
}
public FileDB getFile(String id) {
return fileDBRepository.findById(id).get();
}
public Stream<FileDB> getAllFiles() {
return fileDBRepository.findAll().stream();
}
}
2 dan package com.bezkoder.spring.files.upload.db.service;
import java.io.IOException;
import java.util.stream.Stream;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;
import org.springframework.web.multipart.MultipartFile;
import com.bezkoder.spring.files.upload.db.model.FileDB;
import com.bezkoder.spring.files.upload.db.repository.FileDBRepository;
@Service
public class FileStorageService {
@Autowired
private FileDBRepository fileDBRepository;
public FileDB store(MultipartFile file) throws IOException {
String fileName = StringUtils.cleanPath(file.getOriginalFilename());
FileDB FileDB = new FileDB(fileName, file.getContentType(), file.getBytes());
return fileDBRepository.save(FileDB);
}
public FileDB getFile(String id) {
return fileDBRepository.findById(id).get();
}
public Stream<FileDB> getAllFiles() {
return fileDBRepository.findAll().stream();
}
}
3 adalah untuk memetakan permintaan HTTP GET dan POST ke metode penangan tertentu
- POSTING / unggah. package com.bezkoder.spring.files.upload.db.service; import java.io.IOException; import java.util.stream.Stream; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.util.StringUtils; import org.springframework.web.multipart.MultipartFile; import com.bezkoder.spring.files.upload.db.model.FileDB; import com.bezkoder.spring.files.upload.db.repository.FileDBRepository; @Service public class FileStorageService { @Autowired private FileDBRepository fileDBRepository; public FileDB store(MultipartFile file) throws IOException { String fileName = StringUtils.cleanPath(file.getOriginalFilename()); FileDB FileDB = new FileDB(fileName, file.getContentType(), file.getBytes()); return fileDBRepository.save(FileDB); } public FileDB getFile(String id) { return fileDBRepository.findById(id).get(); } public Stream<FileDB> getAllFiles() { return fileDBRepository.findAll().stream(); } } 4
- DAPATKAN / file. package com.bezkoder.spring.files.upload.db.service; import java.io.IOException; import java.util.stream.Stream; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.util.StringUtils; import org.springframework.web.multipart.MultipartFile; import com.bezkoder.spring.files.upload.db.model.FileDB; import com.bezkoder.spring.files.upload.db.repository.FileDBRepository; @Service public class FileStorageService { @Autowired private FileDBRepository fileDBRepository; public FileDB store(MultipartFile file) throws IOException { String fileName = StringUtils.cleanPath(file.getOriginalFilename()); FileDB FileDB = new FileDB(fileName, file.getContentType(), file.getBytes()); return fileDBRepository.save(FileDB); } public FileDB getFile(String id) { return fileDBRepository.findById(id).get(); } public Stream<FileDB> getAllFiles() { return fileDBRepository.findAll().stream(); } } 5
- DAPATKAN /file/[id]. package com.bezkoder.spring.files.upload.db.service; import java.io.IOException; import java.util.stream.Stream; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.util.StringUtils; import org.springframework.web.multipart.MultipartFile; import com.bezkoder.spring.files.upload.db.model.FileDB; import com.bezkoder.spring.files.upload.db.repository.FileDBRepository; @Service public class FileStorageService { @Autowired private FileDBRepository fileDBRepository; public FileDB store(MultipartFile file) throws IOException { String fileName = StringUtils.cleanPath(file.getOriginalFilename()); FileDB FileDB = new FileDB(fileName, file.getContentType(), file.getBytes()); return fileDBRepository.save(FileDB); } public FileDB getFile(String id) { return fileDBRepository.findById(id).get(); } public Stream<FileDB> getAllFiles() { return fileDBRepository.findAll().stream(); } } 6
– Kami menggunakan package com.bezkoder.spring.files.upload.db.service; import java.io.IOException; import java.util.stream.Stream; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.util.StringUtils; import org.springframework.web.multipart.MultipartFile; import com.bezkoder.spring.files.upload.db.model.FileDB; import com.bezkoder.spring.files.upload.db.repository.FileDBRepository; @Service public class FileStorageService { @Autowired private FileDBRepository fileDBRepository; public FileDB store(MultipartFile file) throws IOException { String fileName = StringUtils.cleanPath(file.getOriginalFilename()); FileDB FileDB = new FileDB(fileName, file.getContentType(), file.getBytes()); return fileDBRepository.save(FileDB); } public FileDB getFile(String id) { return fileDBRepository.findById(id).get(); } public Stream<FileDB> getAllFiles() { return fileDBRepository.findAll().stream(); } } _7 untuk menyuntikkan implementasi kacang package com.bezkoder.spring.files.upload.db.service; import java.io.IOException; import java.util.stream.Stream; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.util.StringUtils; import org.springframework.web.multipart.MultipartFile; import com.bezkoder.spring.files.upload.db.model.FileDB; import com.bezkoder.spring.files.upload.db.repository.FileDBRepository; @Service public class FileStorageService { @Autowired private FileDBRepository fileDBRepository; public FileDB store(MultipartFile file) throws IOException { String fileName = StringUtils.cleanPath(file.getOriginalFilename()); FileDB FileDB = new FileDB(fileName, file.getContentType(), file.getBytes()); return fileDBRepository.save(FileDB); } public FileDB getFile(String id) { return fileDBRepository.findById(id).get(); } public Stream<FileDB> getAllFiles() { return fileDBRepository.findAll().stream(); } } 8 ke variabel lokal
Konfigurasi Sumber Data Musim Semi, JPA, Hibernasi
Di bawah folder src/main/resources, buka aplikasi. properti dan menulis baris ini
– Untuk MySQL
spring.datasource.url= jdbc:mysql://localhost:3306/testdb?useSSL=false spring.datasource.username= root spring.datasource.password= 123456 spring.jpa.properties.hibernate.dialect= org.hibernate.dialect.MySQL5InnoDBDialect # Hibernate ddl auto (create, create-drop, validate, update) spring.jpa.hibernate.ddl-auto= update– Untuk PostgreSQL
<dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <scope>runtime</scope> </dependency> 0- package com.bezkoder.spring.files.upload.db.service; import java.io.IOException; import java.util.stream.Stream; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.util.StringUtils; import org.springframework.web.multipart.MultipartFile; import com.bezkoder.spring.files.upload.db.model.FileDB; import com.bezkoder.spring.files.upload.db.repository.FileDBRepository; @Service public class FileStorageService { @Autowired private FileDBRepository fileDBRepository; public FileDB store(MultipartFile file) throws IOException { String fileName = StringUtils.cleanPath(file.getOriginalFilename()); FileDB FileDB = new FileDB(fileName, file.getContentType(), file.getBytes()); return fileDBRepository.save(FileDB); } public FileDB getFile(String id) { return fileDBRepository.findById(id).get(); } public Stream<FileDB> getAllFiles() { return fileDBRepository.findAll().stream(); } } 9 & package com.bezkoder.spring.files.upload.db.message; public class ResponseFile { private String name; private String url; private String type; private long size; public ResponseFile(String name, String url, String type, long size) { this.name = name; this.url = url; this.type = type; this.size = size; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getUrl() { return url; } public void setUrl(String url) { this.url = url; } public String getType() { return type; } public void setType(String type) { this.type = type; } public long getSize() { return size; } public void setSize(long size) { this.size = size; } } 0 properti sama dengan instalasi database Anda
- Spring Boot menggunakan Hibernate untuk implementasi JPA, kami mengonfigurasi package com.bezkoder.spring.files.upload.db.message; public class ResponseFile { private String name; private String url; private String type; private long size; public ResponseFile(String name, String url, String type, long size) { this.name = name; this.url = url; this.type = type; this.size = size; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getUrl() { return url; } public void setUrl(String url) { this.url = url; } public String getType() { return type; } public void setType(String type) { this.type = type; } public long getSize() { return size; } public void setSize(long size) { this.size = size; } } 1 untuk MySQL atau package com.bezkoder.spring.files.upload.db.message; public class ResponseFile { private String name; private String url; private String type; private long size; public ResponseFile(String name, String url, String type, long size) { this.name = name; this.url = url; this.type = type; this.size = size; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getUrl() { return url; } public void setUrl(String url) { this.url = url; } public String getType() { return type; } public void setType(String type) { this.type = type; } public long getSize() { return size; } public void setSize(long size) { this.size = size; } } 2 untuk PostgreSQL
- package com.bezkoder.spring.files.upload.db.message; public class ResponseFile { private String name; private String url; private String type; private long size; public ResponseFile(String name, String url, String type, long size) { this.name = name; this.url = url; this.type = type; this.size = size; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getUrl() { return url; } public void setUrl(String url) { this.url = url; } public String getType() { return type; } public void setType(String type) { this.type = type; } public long getSize() { return size; } public void setSize(long size) { this.size = size; } } 3 digunakan untuk inisialisasi database. Kami menetapkan nilai ke package com.bezkoder.spring.files.upload.db.message; public class ResponseFile { private String name; private String url; private String type; private long size; public ResponseFile(String name, String url, String type, long size) { this.name = name; this.url = url; this.type = type; this.size = size; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getUrl() { return url; } public void setUrl(String url) { this.url = url; } public String getType() { return type; } public void setType(String type) { this.type = type; } public long getSize() { return size; } public void setSize(long size) { this.size = size; } } 4 nilai sehingga tabel akan dibuat dalam database secara otomatis sesuai dengan model data yang ditentukan. Setiap perubahan pada model juga akan memicu pembaruan pada tabel. Untuk produksi, properti ini harus package com.bezkoder.spring.files.upload.db.message; public class ResponseFile { private String name; private String url; private String type; private long size; public ResponseFile(String name, String url, String type, long size) { this.name = name; this.url = url; this.type = type; this.size = size; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getUrl() { return url; } public void setUrl(String url) { this.url = url; } public String getType() { return type; } public void setType(String type) { this.type = type; } public long getSize() { return size; } public void setSize(long size) { this.size = size; } } 5
Konfigurasi File Multipart untuk Servlet
Mari tentukan ukuran file maksimum yang dapat diunggah di aplikasi. properti sebagai berikut
– package com.bezkoder.spring.files.upload.db.message;
public class ResponseFile {
private String name;
private String url;
private String type;
private long size;
public ResponseFile(String name, String url, String type, long size) {
this.name = name;
this.url = url;
this.type = type;
this.size = size;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getUrl() {
return url;
}
public void setUrl(String url) {
this.url = url;
}
public String getType() {
return type;
}
public void setType(String type) {
this.type = type;
}
public long getSize() {
return size;
}
public void setSize(long size) {
this.size = size;
}
}
6. ukuran file maks untuk setiap permintaan
– package com.bezkoder.spring.files.upload.db.message;
public class ResponseFile {
private String name;
private String url;
private String type;
private long size;
public ResponseFile(String name, String url, String type, long size) {
this.name = name;
this.url = url;
this.type = type;
this.size = size;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getUrl() {
return url;
}
public void setUrl(String url) {
this.url = url;
}
public String getType() {
return type;
}
public void setType(String type) {
this.type = type;
}
public long getSize() {
return size;
}
public void setSize(long size) {
this.size = size;
}
}
_7. ukuran permintaan maks untuk multipart/formulir-data
Tangani Pengecualian Unggah File
Di sinilah kami menangani kasus di mana permintaan melebihi Ukuran Unggahan Maks. Sistem akan melempar package com.bezkoder.spring.files.upload.db.message; public class ResponseFile { private String name; private String url; private String type; private long size; public ResponseFile(String name, String url, String type, long size) { this.name = name; this.url = url; this.type = type; this.size = size; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getUrl() { return url; } public void setUrl(String url) { this.url = url; } public String getType() { return type; } public void setType(String type) { this.type = type; } public long getSize() { return size; } public void setSize(long size) { this.size = size; } } 8 dan kami akan menggunakan package com.bezkoder.spring.files.upload.db.message; public class ResponseFile { private String name; private String url; private String type; private long size; public ResponseFile(String name, String url, String type, long size) { this.name = name; this.url = url; this.type = type; this.size = size; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getUrl() { return url; } public void setUrl(String url) { this.url = url; } public String getType() { return type; } public void setType(String type) { this.type = type; } public long getSize() { return size; } public void setSize(long size) { this.size = size; } } 9 dengan package com.bezkoder.spring.files.upload.db.message; public class ResponseMessage { private String message; public ResponseMessage(String message) { this.message = message; } public String getMessage() { return message; } public void setMessage(String message) { this.message = message; } } 0anotasi untuk menangani pengecualian
pengecualian/FileUploadExceptionAdvice. Jawa
<dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <scope>runtime</scope> </dependency> _2Jalankan & Uji
Jalankan aplikasi Spring Boot dengan perintah. package com.bezkoder.spring.files.upload.db.message;
public class ResponseMessage {
private String message;
public ResponseMessage(String message) {
this.message = message;
}
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
}
1
Mari gunakan Postman untuk membuat beberapa permintaan
– Unggah beberapa file
– Unggah file dengan ukuran lebih besar dari ukuran file maks (2MB)
– Periksa tabel file di Database
– Ambil daftar informasi File
– Sekarang Anda dapat mengunduh file apa pun dari salah satu jalur di atas
Sebagai contoh. package com.bezkoder.spring.files.upload.db.message;
public class ResponseMessage {
private String message;
public ResponseMessage(String message) {
this.message = message;
}
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
}
2
Kesimpulan
Hari ini kita telah belajar cara membuat Aplikasi Spring Boot untuk mengunggah file multipart dan mendapatkan informasi file dengan folder statis melalui Restful API