文件上传到本地磁盘
文件上传步骤
- 定义一个静态常量,就是上传文件的存储目录;
- 如果这个父目录不存在就创建;
- 获取要上传文件的文件名,这个文件的类型是MultipartFile;
- 如果这个文件存在,那就改个名字(可以在这个文件的名称的前面加一个时间戳或者uuid来做区分,也可以这个文件存在了就不上传了,避免重复);
- 要上传到的整体文件路径就是存储目录+下划线(这个下划线可以用File.separator来产生)+加文件名;
- 最后要上传的文件.transferTo(然后整体文件路径)就可以上传了。
文件下载步骤
- 传入两个参数,一个是文件名,一个HttpServletResponse响应;
- 前面上传文件的存储目录+下划线+传入的文件名就是存储路径;
- 判断文件如果不存在,return空,否则将这个文件转成字节,(通过hutool工具的FileUtil.readBytes来转),然后通过那个响应获得一个输出流的write方法来写出文件。最后刷新关闭流就可以了。
实现案例
pom文件
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.qq</groupId>
<artifactId>fileUploadDownload</artifactId>
<version>1.0-SNAPSHOT</version>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.7.9-SNAPSHOT</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.16</version>
<scope>compile</scope>
</dependency>
<!--hutool工具实现导入与导出-->
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>5.7.20</version>
</dependency>
</dependencies>
</project>
application.properties文件
server.port=9090
ip=localhost
启动类
@SpringBootApplication
public class FileSpringBootApplication {
public static void main(String[] args) {
SpringApplication.run(FileSpringBootApplication.class,args);
System.out.println("启动成功");
}
}
统一返回包装类
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Result {
private String code;
private String msg;
private Object data;
public static Result success() {
return new Result(Constants.CODE_200, "", null);
}
public static Result success(Object data) {
return new Result(Constants.CODE_200, "", data);
}
public static Result error(String code, String msg) {
return new Result(code, msg, null);
}
public static Result error() {
return new Result(Constants.CODE_500, "系统错误", null);
}
}
public interface Constants {
String CODE_200 = "200"; //成功
String CODE_500 = "500"; // 系统错误
}
控制类
import cn.hutool.core.io.FileUtil;
import com.qq.common.Result;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import javax.annotation.Resource;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;
import java.io.File;
import java.io.IOException;
@RestController
@RequestMapping("/file")
public class Filecontroller2 {
@Resource
@Value("${ip:localhost}")
String ip;
@Resource
@Value("${server.port}")
String port;
private static final String ROOT_PATH=System.getProperty("user.dir")+File.separator+"files";
@PostMapping("/upload")
public Result upload(MultipartFile file) throws IOException{
String originalFilename = file.getOriginalFilename();
// String mainName = FileUtil.mainName(originalFilename);文件主体名,比如aaa.jpg,主体名就是aaa
// String extName = FileUtil.extName(originalFilename);//获取文件后缀
if (!FileUtil.exist(ROOT_PATH)){
FileUtil.mkdir(ROOT_PATH);
}
if (FileUtil.exist(ROOT_PATH+File.separator+originalFilename)){
originalFilename=System.currentTimeMillis()+"_"+originalFilename;
}
File saveFile = new File(ROOT_PATH+File.separator+originalFilename);
file.transferTo(saveFile);
String url = "http://"+ip+":"+port+"/file/download/"+originalFilename;
return Result.success(url);
}
@GetMapping("/download/{fileName}")
public void download(@PathVariable String fileName, HttpServletResponse response)throws IOException{
String filePath = ROOT_PATH+File.separator+fileName;
if (!FileUtil.exist(filePath)){
return;
}
byte[] bytes = FileUtil.readBytes(filePath);
ServletOutputStream outputStream = response.getOutputStream();
//设置输出流格式
response.addHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(fileName, "UTF-8"));//写出流的格式
response.setContentType("application/octet-stream");
outputStream.write(bytes);
outputStream.flush();
outputStream.close();
}
}
测试 (postman)
文件上传到阿里云OSS
文件上传步骤
- 登录阿里云,搜索OSS对象关系存储,创建Bucket。
- pom文件添加阿里云oss依赖
- properties文件添加阿里云oss相关配置,地域节点点、域名、仓库名,accessKeyId等
- 写配置类获得properties文件中的值,实现InitializingBean接口,重写afterPropertiesSet方法,将获得的值赋给静态常量,便于后面静态方法中调用。
- 写实现业务类,添加上传文件功能的静态方法,给要上传的文件名前面添加uuid做区分,创建Oss客户端,通过Oss客户端的putObject方法上传文件,最后关闭客户端,通过控制类调用这个静态方法。
案例演示:
登录阿里云,搜索OSS对象关系存储,创建Bucket。
pom
<dependency>
<groupId>com.aliyun.oss</groupId>
<artifactId>aliyun-sdk-oss</artifactId>
<version>3.15.1</version>
</dependency>
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.4</version>
</dependency>
<dependency>
<groupId>commons-beanutils</groupId>
<artifactId>commons-beanutils</artifactId>
<version>1.9.3</version>
</dependency>
application.properties
OssConfig
import org.springframework.beans.factory.InitializingBean;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
@Component
public class OssConfig implements InitializingBean {
@Value("${oss.endpoint}")
String endpoint;
@Value("${oss.accessKeyId}")
String accessKeyId;
@Value("${oss.accessKeySecret}")
String accessKeySecret;
@Value("${oss.bucketName}")
String bucketName;
@Value("${oss.fileUrlPrefix}")
String fileUrlPrefix;//阿里域名
//定义公开静态常量
public static String END_POIND;
public static String ACCESS_KEY_ID;
public static String ACCESS_KEY_SECRET;
public static String BUCKET_NAME;
public static String FILE_URL_PREFIX;
@Override
public void afterPropertiesSet() throws Exception {
END_POIND = endpoint;
ACCESS_KEY_ID = accessKeyId;
ACCESS_KEY_SECRET = accessKeySecret;
BUCKET_NAME = bucketName;
FILE_URL_PREFIX = fileUrlPrefix;
}
}
UploadUtil
import cn.hutool.core.io.FileUtil;
import com.aliyun.oss.OSS;
import com.aliyun.oss.OSSClientBuilder;
import org.springframework.web.multipart.MultipartFile;
import java.io.IOException;
import java.util.UUID;
public class UploadUtil {
//OSS客户端对象
static OSS ossClient = new OSSClientBuilder().build(OssConfig.END_POIND,OssConfig.ACCESS_KEY_ID,OssConfig.ACCESS_KEY_SECRET);
public static String uploadImage(MultipartFile file)throws IOException{
String originalFilename = file.getOriginalFilename();
String extName = "."+FileUtil.extName(originalFilename);//获取文件后缀
//String extName = "."+ FilenameUtils.getExtension(originalFilename); //获取文件后缀
String uuid= UUID.randomUUID().toString().replace("-","");
String fileName=uuid+extName;
ossClient.putObject(
OssConfig.BUCKET_NAME,//仓库名
fileName,//文件名
file.getInputStream()
);
ossClient.shutdown();
return OssConfig.FILE_URL_PREFIX+fileName;
}
}
一些需要的配置复制的内容如下:
controller
@RestController
public class Filecontroller {
@PostMapping("/upImg")
public String upImg(MultipartFile file) throws IOException{
return UploadUtil.uploadImage(file);
}
}
测试
阿里云中查看文件上传成功
参考