文件上传和下载

文件上传到本地磁盘

文件上传步骤

  1. 定义一个静态常量,就是上传文件的存储目录;
  2. 如果这个父目录不存在就创建;
  3. 获取要上传文件的文件名,这个文件的类型是MultipartFile;
  4. 如果这个文件存在,那就改个名字(可以在这个文件的名称的前面加一个时间戳或者uuid来做区分,也可以这个文件存在了就不上传了,避免重复);
  5. 要上传到的整体文件路径就是存储目录+下划线(这个下划线可以用File.separator来产生)+加文件名;
  6. 最后要上传的文件.transferTo(然后整体文件路径)就可以上传了。

 文件下载步骤

  1. 传入两个参数,一个是文件名,一个HttpServletResponse响应;
  2. 前面上传文件的存储目录+下划线+传入的文件名就是存储路径;
  3. 判断文件如果不存在,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

文件上传步骤

  1. 登录阿里云,搜索OSS对象关系存储,创建Bucket。
  2. pom文件添加阿里云oss依赖
  3. properties文件添加阿里云oss相关配置,地域节点点、域名、仓库名,accessKeyId等
  4. 写配置类获得properties文件中的值,实现InitializingBean接口,重写afterPropertiesSet方法,将获得的值赋给静态常量,便于后面静态方法中调用。
  5. 写实现业务类,添加上传文件功能的静态方法,给要上传的文件名前面添加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);
    }
}
 测试

阿里云中查看文件上传成功

可以参考阿里云开发文档:Java对象/文件_对象存储 OSS-阿里云帮助中心 (aliyun.com)icon-default.png?t=N7T8https://help.aliyun.com/zh/oss/developer-reference/objects-8/?spm=a2c4g.11186623.0.0.15254f30U3njhk

参考

使用阿里云OSS实现文件的上传、下载、删除及修改功能_oss下载文件_我代码没错的博客-CSDN博客icon-default.png?t=N7T8https://blog.csdn.net/qq_45442178/article/details/130827543?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522169569354716800211513160%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id=169569354716800211513160&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~blog~sobaiduend~default-1-130827543-null-null.nonecase&utm_term=%E9%98%BF%E9%87%8C%E4%BA%91oss%E4%B8%8B%E8%BD%BD%E6%96%87%E4%BB%B6&spm=1018.2226.3001.4450

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值