本文介紹了Java Spring-無法將圖像保存到靜態文件夾的處理方法,對大家解決問題具有一定的參考價值,需要的朋友們下面隨著小編來一起學習吧!
問題描述
我想將圖像保存到resources/static/photos
文件,但Java/Kotlin找不到它。但它發現project/photos
很好。
這是用科特林編寫的代碼,但我認為這無關緊要
override fun saveImage(imageFile: MultipartFile, id: String) {
val bytes = imageFile.bytes
val path = Paths.get(
"$imagesFolderPath$id.${imageFile.originalFilename.substringAfter('.')}")
Files.write(path, bytes)
}
我需要將此文件保存到resources/static/photos
,以便能夠從胸腺葉訪問它。
謝謝。
推薦答案
問題是,您可能能夠在開發階段將文件保存在項目目錄中,但一旦將項目導出為應用程序包(<[2-3]-應用程序、.war
-存檔等),就不可能做到這一點,因為在這一點上,以前是文件系統上的實際目錄的所有內容現在都是單個文件。
以下是如何通過將圖像保存在可配置文件夾中來實現此功能的示例:
我從未用Kotlin編寫過一行代碼。我希望這個示例能夠幫助您,即使它是用Java編寫的。
這是一個示例控制器,它接受要在POST
終結點上載并在GET
終結點下載的圖像:
package example;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.core.io.PathResource;
import org.springframework.core.io.Resource;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import javax.annotation.PostConstruct;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.StandardOpenOption;
import java.util.Optional;
@RestController
public class MyController {
private final Path imageStorageDir;
/*
The target path can be configured in the application.properties / application.yml or using the parameter -Dimage-storage.dir=/some/path/
*/
@Autowired
public MyController(@Value("${image-storage-dir}") Path imageStorageDir) {
this.imageStorageDir = imageStorageDir;
}
@PostConstruct
public void ensureDirectoryExists() throws IOException {
if (!Files.exists(this.imageStorageDir)) {
Files.createDirectories(this.imageStorageDir);
}
}
/*
This enables you to perform POST requests against the "/image/YourID" path
It returns the name this image can be referenced on later
*/
@PostMapping(value = "/image/{id}", produces = MediaType.TEXT_PLAIN_VALUE)
public String uploadImage(@RequestBody MultipartFile imageFile, @PathVariable("id") String id) throws IOException {
final String fileExtension = Optional.ofNullable(imageFile.getOriginalFilename())
.flatMap(MyController::getFileExtension)
.orElse("");
final String targetFileName = id + "." + fileExtension;
final Path targetPath = this.imageStorageDir.resolve(targetFileName);
try (InputStream in = imageFile.getInputStream()) {
try (OutputStream out = Files.newOutputStream(targetPath, StandardOpenOption.CREATE)) {
in.transferTo(out);
}
}
return targetFileName;
}
/*
This enables you to download previously uploaded images
*/
@GetMapping("/image/{fileName}")
public ResponseEntity<Resource> downloadImage(@PathVariable("fileName") String fileName) {
final Path targetPath = this.imageStorageDir.resolve(fileName);
if (!Files.exists(targetPath)) {
return ResponseEntity.notFound().build();
}
return ResponseEntity.ok(new PathResource(targetPath));
}
private static Optional<String> getFileExtension(String fileName) {
final int indexOfLastDot = fileName.lastIndexOf('.');
if (indexOfLastDot == -1) {
return Optional.empty();
} else {
return Optional.of(fileName.substring(indexOfLastDot + 1));
}
}
}
假設您上傳了文件結尾為.png
、id為HelloWorld
的am圖片,然后可以使用url訪問該圖片:
http://localhost:8080/image/HelloWorld.png
使用此URL,您還可以在任何胸腺葉模板中引用該圖像:
<img th:src="@{/image/HelloWorld.png}"></img>
這篇關于Java Spring-無法將圖像保存到靜態文件夾的文章就介紹到這了,希望我們推薦的答案對大家有所幫助,