文件上传方案

  1. 服务器文件上传方案(保存在服务器本地)
    1. 文件上传接口
    2. linux开放静态资源(Nginx)

服务器文件上传方案(保存在服务器本地)

解析 Java 的 MultipartFile 接口:实现文件上传的全面指南-阿里云开发者社区 (aliyun.com)

文件上传接口

package pers.os467.management.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import pers.os467.management.base.ResponseUtils;
import pers.os467.management.base.response.ResponseEntity;
import pers.os467.management.utils.IdWorker;


import java.io.*;



@Controller
@RequestMapping("/file")
public class FileController {

    @PostMapping("/upload")
    public ResponseEntity uploadFile(@RequestParam("file") MultipartFile multipartFile){

        IdWorker idWorker = new IdWorker(1, 1);

        long fileId = idWorker.nextId();

        String contentType = multipartFile.getContentType();
        String extraName = contentType.substring(contentType.indexOf("/")+1);

        String fileName = fileId+"."+extraName;

        try {
            multipartFile.transferTo(new File(fileName));
        } catch (IOException e) {
            e.printStackTrace();
        }

        return ResponseUtils.getSuccessResult(fileName);
    }

}

文件名使用雪花算法生成id

配置transferTo的文件路径地址

package pers.os467.management.config;

import io.netty.util.internal.StringUtil;
import org.springframework.boot.web.servlet.MultipartConfigFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.beans.factory.annotation.Value;
import javax.servlet.MultipartConfigElement;
import java.io.File;

@Configuration
public class FileConfig {

    @Value("${spring.servlet.multipart.location}")
    private String filePath;

    @Bean
    public MultipartConfigElement multipartConfigElement(){

        MultipartConfigFactory factory = new MultipartConfigFactory();

        if (!StringUtil.isNullOrEmpty(filePath)) {
            File file = new File(filePath);
            if (!file.exists()) {
                boolean dirCreated = file.mkdir();
                if(! dirCreated){
                    throw new RuntimeException("create file " + file.getAbsolutePath() + " failed!");
                }
            }

            // 需要写和执行的权限
            if(! (file.canWrite() && file.canExecute())){
                throw new RuntimeException(file.getAbsolutePath() + " Permission denied!");
            }
        }

        factory.setLocation(filePath);
        return factory.createMultipartConfig();
    }

}

linux开放静态资源(Nginx)

如何访问Linux服务器上的图片资源呢 - 谢呈勖 - 博客园 (cnblogs.com)

配置nginx/conf/nginx.conf

nginx/sbin/下 ./nginx -t 检测conf可用性

./nginx 启动

./nginx -s reload 重启

./nginx -s stop 停止

将以下访问规则配置到80端口中

方法1 root

#图片配置
        location /image/ {
            root   /opt/temp/;
            autoindex  on;
        }
#autoindex作用 含义: 自动创建索引 on是打开 off关闭

此匹配规则为 匹配 http://ip/image/xxx.jpg 定位资源到服务器的 /opt/temp/image/xxx.jpg

也就是将/image/开头的访问直接拼接到 root 规定的资源地址后

方法2 alias

 #图片配置
        location /image/ {
                alias /image/student_management/;
                autoindex on;
        }

将匹配 http://ip/image/xxx.jpg 定位资源到服务器的 /image/student_management/xxx.jpg

也就是直接将/image/给替换为 定位资源的路径


转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以邮件至 1300452403@qq.com

文章标题:文件上传方案

字数:568

本文作者:Os467

发布时间:2023-12-24, 19:20:53

最后更新:2023-12-24, 19:23:05

原始链接:https://os467.github.io/2023/12/24/%E6%96%87%E4%BB%B6%E4%B8%8A%E4%BC%A0%E6%96%B9%E6%A1%88/

版权声明: "署名-非商用-相同方式共享 4.0" 转载请保留原文链接及作者。

×

喜欢就点赞,疼爱就打赏