1. 圖片上傳實現步驟
1.1 添加依賴
確保 spring-boot-starter-web
和 spring-boot-starter-validation
已存在:
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-validation</artifactId>
</dependency>
1.2 配置文件上傳限制
在 application.properties
中配置最大文件大小:
spring.servlet.multipart.max-file-size=10MB
spring.servlet.multipart.max-request-size=10MB
1.3 編寫上傳接口
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import java.io.File;
import java.io.IOException;
import java.util.UUID;@RestController
public class ImageController {// 指定圖片存儲目錄(示例路徑,建議使用配置類或環境變量)private final String UPLOAD_DIR = "src/main/resources/static/images/";@PostMapping("/upload")public String uploadImage(@RequestParam("file") MultipartFile file) throws IOException {if (file.isEmpty()) {return "文件不能為空";}// 生成唯一文件名(防止重復)String originalFilename = file.getOriginalFilename();String fileExtension = originalFilename.substring(originalFilename.lastIndexOf("."));String newFileName = UUID.randomUUID() + fileExtension;// 創建目標文件File dest = new File(UPLOAD_DIR + newFileName);if (!dest.getParentFile().exists()) {dest.getParentFile().mkdirs(); // 創建目錄}// 保存文件file.transferTo(dest);return "上傳成功,訪問地址: /images/" + newFileName;}
}
1.4 配置靜態資源訪問
默認情況下,static
目錄下的文件可以直接訪問。如果需要自定義路徑,添加配置類:
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;@Configuration
public class WebConfig implements WebMvcConfigurer {@Overridepublic void addResourceHandlers(ResourceHandlerRegistry registry) {registry.addResourceHandler("/images/**").addResourceLocations("file:src/main/resources/static/images/");}
}
2. 圖片修改實現步驟
修改圖片通常需要先刪除舊圖片,再上傳新圖片,并更新數據庫記錄(如果有)。
2.1 添加刪除舊圖片的邏輯
public class ImageController {@PostMapping("/update")public String updateImage(@RequestParam("oldFileName") String oldFileName,@RequestParam("newFile") MultipartFile newFile) throws IOException {// 刪除舊圖片File oldFile = new File(UPLOAD_DIR + oldFileName);if (oldFile.exists()) {oldFile.delete();}// 上傳新圖片return uploadImage(newFile);}
}
2.2 結合數據庫操作(示例)
如果圖片路徑存儲在數據庫中,需結合JPA/Hibernate更新記錄:
@Entity
public class User {@Id@GeneratedValue(strategy = GenerationType.IDENTITY)private Long id;private String avatar; // 圖片路徑字段// getter/setter
}@RestController
public class UserController {@Autowiredprivate UserRepository userRepository;@PostMapping("/user/{userId}/avatar")public String updateAvatar(@PathVariable Long userId,@RequestParam("file") MultipartFile file) throws IOException {User user = userRepository.findById(userId).orElseThrow();// 刪除舊頭像(如果有)if (user.getAvatar() != null) {File oldFile = new File(UPLOAD_DIR + user.getAvatar());if (oldFile.exists()) oldFile.delete();}// 上傳新頭像并更新數據庫String newFileName = UUID.randomUUID() + getFileExtension(file);file.transferTo(new File(UPLOAD_DIR + newFileName));user.setAvatar(newFileName);userRepository.save(user);return "頭像更新成功";}private String getFileExtension(MultipartFile file) {String name = file.getOriginalFilename();return name.substring(name.lastIndexOf("."));}
}
3. 前端調用示例(HTML)
<form action="/upload" method="post" enctype="multipart/form-data"><input type="file" name="file"><button type="submit">上傳</button>
</form><form action="/update" method="post" enctype="multipart/form-data"><input type="hidden" name="oldFileName" value="old-image.jpg"><input type="file" name="newFile"><button type="submit">修改圖片</button>
</form>
4. 注意事項
- 安全性:限制文件類型(如僅允許
image/jpeg
,image/png
),避免上傳惡意文件。 - 異常處理:捕獲
IOException
并返回友好提示。 - 分布式部署:若多實例部署,需使用云存儲(如阿里云OSS、七牛云)替代本地存儲。
- 路徑管理:建議將上傳路徑配置在
application.properties
中,避免硬編碼。
通過以上步驟,即可在Spring Boot中實現圖片的上傳和修改功能。