本节是系列笔记第七课。这是一个Spring上传文件的例子。前面六节可参考我的博客。
本章创建一个依赖 Spring Web 、 Thymeleaf .的SpringBoot项目:
这里要先说明一件事。就是这里提到:在生产场景,你更多机会存储文件在数据库,NoSQL,Mongo's GridFS.最好别直接存在项目目录里面。这是实话。我们就可能会用到阿里云云存储OSS。七牛啥的。所以我们需要提供一个StorageService ,这里还是用的文件系统。他的接口如下:
package com.dongyu.demo.storage;
import org.springframework.core.io.Resource;
import org.springframework.web.multipart.MultipartFile;
import java.nio.file.Path;
import java.util.stream.Stream;
public interface StorageService {
void init();
void store(MultipartFile file);
Stream<Path> loadAll();
Path load(String filename);
Resource loadAsResource(String filename);
void deleteAll();
}
当然我还要写一个接口实现。项目结构如下
/springGuides7-uploading-files/src/main/java/com/dongyu/uploadingfiles/storage/StorageService.java
接口实现:
package com.dongyu.uploadingfiles.storage;
import java.nio.file.Path;
import java.util.stream.Stream;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.io.Resource;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;
@Service
public class FateMsgStorageService implements StorageService {
private static final Logger log =LoggerFactory.getLogger(FateMsgStorageService.class);
@Autowired
public FateMsgStorageService() {
log.info("===FateMsgStorageService @Autowired...0");
}
@Override
public void init() {
// TODO Auto-generated method stub
log.info("===FateMsgStorageService init...1");
}
@Override
public void store(MultipartFile file) {
// TODO Auto-generated method stub
log.info("===FateMsgStorageService store...2");
}
@Override
public Stream<Path> loadAll() {
// TODO Auto-generated method stub
log.info("===FateMsgStorageService loadAll...3");
return null;
}
@Override
public Path load(String filename) {
log.info("===FateMsgStorageService load...4");
return null;
}
@Override
public Resource loadAsResource(String filename) {
log.info("===FateMsgStorageService loadAsResource...5");
return null;
}
@Override
public void deleteAll() {
// TODO Auto-generated method stub
log.info("===FateMsgStorageService deleteAll...6");
}
}
为了初始化Store.需要在项目启动的时候做点事情。这里用CommandLineRunner.
package com.dongyu.uploadingfiles;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Bean;
import com.dongyu.uploadingfiles.storage.StorageService;
@SpringBootApplication
public class SpringGuides7UploadingFilesApplication {
private static final Logger log =LoggerFactory.getLogger(SpringGuides7UploadingFilesApplication.class);
public static void main(String[] args) {
log.info("===SpringApplication.run start .");
SpringApplication.run(SpringGuides7UploadingFilesApplication.class, args);
log.info("===SpringApplication.run end .");
}
@Bean
CommandLineRunner init(StorageService storageService) {
log.info("===CommandLineRunner init .");
return (args) -> { // lambda 表达式
storageService.deleteAll();
storageService.init();
};
}
}
按照项目结构复制这3个文件后。就可以run as-> spring boot app了。
看下我们的结果:
在CommandLineRuner init前SpringBoot已经帮我Autowired一个StorageService.,
所以我在CommandlineRuner里可以对Service 做相应的动作。
这一部分如果有什么问题,请给我留言。毕竟我看官网的例子,使用的接口实现非常复杂,我需要拆开,一步一步看是哪里除了问题。
好的。我现在要jia'r
项目源码下载地址:https://github.com/spring-guides/gs-uploading-files.git