SpringBoot 搭建图片服务器 -- 支持上传下载和浏览

前言:

        项目需求:做一个图片服务器,用于存放业务部门做的宣传图片;支持上传、下载和在线查看。

一、需求分解

1. 上传、下载功能比较成熟,相对好实现;

2. 在线预览,需要分为单个文件预览和多个文件预览;

二、接口设计

请求路径描述
POST        /pic/upload上传接口,返回文件预览地址
GET         /pic/download?fileName=文件下载接口
GET        /pic/list文件列表,返回文件预览地址数组
GET        /pic/file/文件单文件预览;资源查找设计,无相关接口设计

三、功能实现

工具列表:

jdk:    1.8.0_291
springboot:    2.3.2.RELEASE
IDEA:    2019.3.5

配置文件:

server:
  port: 8002
  servlet:
    context-path: /pic
spring:
  application:
    name: pic-server
  jackson:
    default-property-inclusion: non_null
    date-format: yyyy-MM-dd HH:mm:ss
    time-zone: GMT+8

pic:
  dir: F:/work/pic/

1. 文件预览

添加资源配置:


@Configuration
public class PicConfig implements WebMvcConfigurer {

    @Value("${pic.dir}")
    private String picDir;

    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        registry.addResourceHandler("/file/**")
                .addResourceLocations("file:" + picDir);
    }
}

配置好以后可以启动工程查看图片资源:

本地目录下的资源如下:

PostMan 请求:

2. 文件上传、下载,文件列表

 接口描述:

@Slf4j
@RestController
@RequestMapping()
public class PicController {

    @Autowired
    FileService fileService;

    @PostMapping("/upload")
    public ResultBean upload(@RequestParam("media") MultipartFile file) {
        log.info("save file name {}", file.getOriginalFilename());
        String filePath = fileService.saveFile(file);
        return ResultBean.success(filePath);
    }

    @GetMapping("/download")
    public ResultBean downloadFile(HttpServletResponse response,
                                   @RequestParam(value = "fileName") String fileName) {

        Boolean result = fileService.downloadFile(response, fileName);
        return ResultBean.success(result);
    }

    @GetMapping("/list")
    public ResultBean list() {
        return ResultBean.success(fileService.getFiles());
    }

}

:ResultBean 结构体可参考如果优美地设计 springboot 接口返回_清泉影月-CSDN博客

核心服务:

@Slf4j
@Service
public class FileService {

    @Value("${server.port}")
    private String port;

    @Value("${server.servlet.context-path}")
    private String contextPath;

    @Value("${pic.dir}")
    private String picDir;


    public String saveFile(MultipartFile multipartFile) {

        String filename = multipartFile.getOriginalFilename();

        File file = new File(picDir + filename);

        try {
            multipartFile.transferTo(file);
        } catch (IOException e) {
            log.error("save file error,{}", e.getMessage());
            return "";
        }

        return getFileUrl(filename);
    }

    public List<String> getFiles() {
        List<String> fileUrls = new ArrayList<>();

        File file = new File(picDir);
        if (file.isDirectory()) {
            File[] files = file.listFiles();
            if (files != null) {
                for (File file1 : files) {
                    fileUrls.add(getFileUrl(file1.getName()));
                }
            }
        }
        return fileUrls;
    }

    private String getFileUrl(String fileName) {
        try {
            InetAddress address = InetAddress.getLocalHost();
            String fileUrl = "http://" + address.getHostAddress() + ":" + port + contextPath + "/file/" + fileName;
            log.info("fileUrl:{}", fileUrl);
            return fileUrl;
        } catch (UnknownHostException e) {
            log.error("get host error,{}", e.getMessage());
            return "";
        }
    }

    public Boolean downloadFile(HttpServletResponse response, String fileName) {
        File file = new File(picDir + fileName);
        if (file.exists()) {
            try {
                FileInputStream fileInputStream = new FileInputStream(file);

                response.setHeader("content-disposition", "attachment;fileName=" + URLEncoder.encode(fileName, "UTF-8"));
                ServletOutputStream outputStream = response.getOutputStream();

                FileCopyUtils.copy(fileInputStream, outputStream);
                return true;
            } catch (IOException e) {
                log.error("download file error: {}", e.getMessage());
                return false;
            }
        }
        return false;
    }

}

PostMan 测试上传和下载:

上传:

下载(浏览器打开链接会直接下载文件):

四、 结语

        1. 上述是一个开放的存储系统,没有设计权限;

        2. 可以用于存储其它文件,文件预览不保证效果;

        3. 以上引用了某网红的图片,如果涉及侵权,可联系删除。

  • 7
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要在Spring Boot搭建FTP服务器,可以使用Apache Commons Net库,该库提供了FTP服务器实现的支持。下面是一个简单的示例: 1. 添加依赖 在pom.xml文件中添加以下依赖: ```xml <dependency> <groupId>commons-net</groupId> <artifactId>commons-net</artifactId> <version>3.7.2</version> </dependency> ``` 2. 编写FTP服务器配置 在Spring Boot的配置类中,添加以下配置: ```java @Configuration public class FtpServerConfig { @Value("${ftp.server.port}") private int port; @Value("${ftp.server.user}") private String user; @Value("${ftp.server.password}") private String password; @Value("${ftp.server.homeDirectory}") private String homeDirectory; @Bean(initMethod = "start", destroyMethod = "stop") public FtpServerFactoryBean ftpServerFactoryBean() { FtpServerFactoryBean factory = new FtpServerFactoryBean(); factory.setPort(port); // 添加用户 UserManager userManager = new BaseUserManager(); User userObj = new User(); userObj.setName(user); userObj.setPassword(password); userObj.setHomeDirectory(homeDirectory); List<Authority> authorities = new ArrayList<>(); authorities.add(new WritePermission()); userObj.setAuthorities(authorities); try { userManager.save(userObj); } catch (FtpException e) { throw new RuntimeException("Failed to create user", e); } factory.setUserManager(userManager); // 添加文件系统 FileSystemFactory fileSystemFactory = new NativeFileSystemFactory(); factory.setFileSystem(fileSystemFactory); return factory; } } ``` 3. 配置文件 在application.properties或application.yml文件中添加FTP服务器的相关属性: ```properties ftp.server.port=21 ftp.server.user=admin ftp.server.password=password ftp.server.homeDirectory=/ftp ``` 4. 启动FTP服务器Spring Boot应用程序启动后,FTP服务器将自动启动。您可以使用任何FTP客户端连接到服务器,并使用配置的用户名和密码进行身份验证,然后上传下载和管理文件。 以上是一个简单的示例,您可以根据自己的需求进行更改和扩展。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值