任意文件上传mysql_基于SpringBoot上传任意文件功能的实现

一、pom文件依赖的添加

org.springframework.boot

spring-boot-starter-web

org.springframework.boot

spring-boot-starter-test

test

org.springframework.boot

spring-boot-starter-thymeleaf

二、controller层

@Controller

public class FileUploadController {

private final StorageService storageService;

@Autowired

public FileUploadController(StorageService storageService) {

this.storageService = storageService;

}

//展示上传过的文件

@GetMapping("/")

public String listUploadedFiles(Model model) throws IOException {

model.addAttribute("files", storageService.loadAll().map(path ->

MvcUriComponentsBuilder.fromMethodName(FileUploadController.class, "serveFile", path.getFileName().toString())

.build().toString())

.collect(Collectors.toList()));

return "uploadForm";

}

//下载选定的上传的文件

@GetMapping("/files/{filename:.+}")

@ResponseBody

public ResponseEntity serveFile(@PathVariable String filename) {

Resource file = storageService.loadAsResource(filename);

return ResponseEntity

.ok()

.header(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=\""+file.getFilename()+"\"")

.body(file);

}

//上传文件

@PostMapping("/")

public String handleFileUpload(@RequestParam("file") MultipartFile file,

RedirectAttributes redirectAttributes) {

storageService.store(file);

redirectAttributes.addFlashAttribute("message",

"You successfully uploaded " + file.getOriginalFilename() + "!");

return "redirect:/";

}

@ExceptionHandler(StorageFileNotFoundException.class)

public ResponseEntity> handleStorageFileNotFound(StorageFileNotFoundException exc) {

return ResponseEntity.notFound().build();

}

}

三、实现的service层

@Service

public class FileSystemStorageService implements StorageService {

private final Path rootLocation;

@Autowired

public FileSystemStorageService(StorageProperties properties) {

this.rootLocation = Paths.get(properties.getLocation());

}

@Override

public void store(MultipartFile file) {

try {

if (file.isEmpty()) {

throw new StorageException("Failed to store empty file " + file.getOriginalFilename());

}

Files.copy(file.getInputStream(), this.rootLocation.resolve(file.getOriginalFilename()));

} catch (IOException e) {

throw new StorageException("Failed to store file " + file.getOriginalFilename(), e);

}

}

@Override

public Stream loadAll() {

try {

return Files.walk(this.rootLocation, 1)

.filter(path -> !path.equals(this.rootLocation))

.map(path -> this.rootLocation.relativize(path));

} catch (IOException e) {

throw new StorageException("Failed to read stored files", e);

}

}

@Override

public Path load(String filename) {

return rootLocation.resolve(filename);

}

@Override

public Resource loadAsResource(String filename) {

try {

Path file = load(filename);

Resource resource = new UrlResource(file.toUri());

if(resource.exists() || resource.isReadable()) {

return resource;

}

else {

throw new StorageFileNotFoundException("Could not read file: " + filename);

}

} catch (MalformedURLException e) {

throw new StorageFileNotFoundException("Could not read file: " + filename, e);

}

}

@Override

public void deleteAll() {

FileSystemUtils.deleteRecursively(rootLocation.toFile());

}

@Override

public void init() {

try {

Files.createDirectory(rootLocation);

} catch (IOException e) {

throw new StorageException("Could not initialize storage", e);

}

}

}

四、在application.properties文件上配置上传的属性

spring.http.multipart.max-file-size=128KB

spring.http.multipart.max-request-size=128KB

五、服务启动时的处理

a0413cc243be9c34ec1e581d3f233794.png

六、测试成功的结果

eff43027c095c004f30c997cd827a94d.png

以上这篇基于SpringBoot上传任意文件功能的实现就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持脚本之家。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值