Java实现文件上传到服务器本地,并通过url访问

这篇具有很好参考价值的文章主要介绍了Java实现文件上传到服务器本地,并通过url访问。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。


一、场景

Java实现文件上传到服务器本地,并通过url访问

有个需求,前端上传文件,需要用开关的方式同时支持上传七牛和服务器本地,方便不同的用户需求合理分配资源。本篇主要介绍文件上传到本地,然后通过url访问。


二、SpringBoot默认静态资源访问方式

首先想到的就是可以通过SpringBoot通常访问静态资源的方式,当访问:项目根路径 + / + 静态文件名时,SpringBoot会依次去类路径下的四个静态资源目录下查找(默认配置)。

java文件上传 后怎么访问,SpringBoot,业务,java,服务器,spring boot
在资源文件resources目录下建立如下四个目录:

java文件上传 后怎么访问,SpringBoot,业务,java,服务器,spring boot
重启Spring boot,访问
http://localhost:8080/1.jpg
http://localhost:8080/2.jpg
http://localhost:8080/3.jpg
http://localhost:8080/4.jpg

结果:
java文件上传 后怎么访问,SpringBoot,业务,java,服务器,spring boot

三、上传的文件应该存储在哪?怎么访问?

1.文件存储在哪?

前文所说外部用户可通过url访问服务器资源文件resources目录下的静态资源,但若是将上传的文件都保存在resources相关目录下,将会导致后续打包过大,程序和代码不分离,无法查看等问题。

解决方案:文件上传到服务器某个目录,然后SpringBoot配置虚拟路径,映射到此目录。

2.怎么访问?

通过WebMvcConfigurer 的addResourceHandlers将匹配上虚拟路径的url映射到文件上传到服务器的目录,这样就可以通过url来获取服务器上的静态资源了。

示例代码

代码仓库github路径

目标:windows本地测试,将文件上传到 D:\develop\work\project\myblog\myblog-file-upload\fileStorage 目录下,然后通过http://localhost:8080/files/文件名 访问。

配置类

@Configuration
public class WebMvcConfig implements WebMvcConfigurer {

    @Autowired
    FileServiceImpl fileService;

    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        //将匹配上/files/**虚拟路径的url映射到文件上传到服务器的目录,获取静态资源
        registry.addResourceHandler("/" + fileService.pathPattern + "/**").addResourceLocations("file:" + fileService.filePath);
        WebMvcConfigurer.super.addResourceHandlers(registry);
    }
}

Controller

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

    @Autowired
    private FileServiceImpl fileService;

    @PostMapping("/upload")
    public FileUploadResponse upload(@RequestParam("file") MultipartFile file) {
        return fileService.upload(file);
    }
}

上传文件目录创建好后,主要通过 file.transferTo(new File(absolutePath)) 完成。

Service

@Slf4j
@Service
public class FileServiceImpl {

    //拦截的url,虚拟路径
    public String pathPattern = "files";

    //自己设置的目录
    private static final String fileDir = "fileStorage";

    //上传文件存放目录  =  工作目录绝对路径 + 自己设置的目录,也可以直接自己指定服务器目录
    //windows本地测试
    //绝对路径: D:\develop\work\project\myblog\myblog-file-upload\fileStorage\202302021010345680.jpg
    //System.getProperty("user.dir")   D:\develop\work\project\myblog\myblog-file-upload
    //fileDir                          fileStorage
    //fileName                         202302021010345680.jpg
    public String filePath = System.getProperty("user.dir") + File.separator + fileDir + File.separator;

    private static final AtomicInteger SUFFIX = new AtomicInteger(0);

    @Value(value = "${file.upload.suffix:jpg,jpeg,png,bmp,xls,xlsx,pdf}")
    private String fileUploadSuffix;

    public FileUploadResponse upload(MultipartFile file) {
        FileUploadResponse result = new FileUploadResponse();
        if (file.isEmpty()) {
            log.error("the file to be uploaded is empty");
            return result;
        }
        List<String> suffixList = Lists.newArrayList(fileUploadSuffix.split(","));

        try {
            //校验文件后缀
            String originalFilename = file.getOriginalFilename();
            String suffix = originalFilename.substring(originalFilename.lastIndexOf(".") + 1);
            if (!suffixList.contains(suffix)) {
                log.error("unsupported file format");
                return result;
            }

            //首次需生成目录
            File folder = new File(filePath);
            if (!folder.exists()) {
                folder.mkdirs();
            }

            String fileName = timeFormat(System.currentTimeMillis()) + SUFFIX.getAndIncrement() + "." + suffix;
            String absolutePath = filePath + fileName;
            log.info("absolutePath is {}", absolutePath);
            file.transferTo(new File(absolutePath));

            String separator = "/";
            String path = separator + pathPattern + separator + fileName;
            result.setPath(path);
            result.setFileName(fileName);
        } catch (Exception e) {
            log.error("the file upload error occurred. e ", e);
        }
        return result;
    }

    public static String timeFormat(Long time) {
        if (Objects.isNull(time)) {
            return null;
        }
        DateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmssSSS");
        return sdf.format(time);
    }

}

四、测试

java文件上传 后怎么访问,SpringBoot,业务,java,服务器,spring boot
查看文件夹,已上传成功

java文件上传 后怎么访问,SpringBoot,业务,java,服务器,spring boot

将上传接口返回的path拼接上域名或者ip端口、访问 http://localhost:8080/files/202302021010345680.jpg,得到:

java文件上传 后怎么访问,SpringBoot,业务,java,服务器,spring boot


五、总结

其实这和最初的SpringBoot获取静态资源的方式又有点不一样,针对url做拦截,实际上resources目录下并没有files这个文件夹,它只是一个虚拟路径,通过映射转发到文件夹上传目录,在该目录下通过文件名去定位。
另外,如果有用nginx,也可以在其配置中设置转发。文章来源地址https://www.toymoban.com/news/detail-780264.html

到了这里,关于Java实现文件上传到服务器本地,并通过url访问的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • JAVA实现文件上传到服务器

    java如何实现大文件断点续传、秒传,JAVA实现文件上传到服务器,jsp实现文件上传到服务器,SpringBoot实现文件上传到服务器,SpringMVC实现文件上传到服务器,SpringCloud实现文件上传到服务器,webuploader实现文件上传到服务器,百度webuploader实现文件上传到服务器,JAVA如何将文件

    2024年04月27日
    浏览(27)
  • Shell脚本常用命令及如何通过shell脚本实现服务器上文件的上传和下载

    Shell脚本常用命令 简介 1、什么是shell: Shell 是一个用 C 语言编写的应用程序,这个应用程序提供了一个界面,用户通过这个界面访问操作系统内核的服务。Shell 脚本(shell script),是一种为 shell 编写的脚本程序,扩展名为.sh。 2、如何编写shell脚本: 文本编辑器(可以使用

    2024年02月03日
    浏览(49)
  • Java实现文件上传到ftp服务器

    文件传输协议(File Transfer Protocol,FTP)是用于在网络上进行文件传输的一套标准协议,它工作在 OSI 模型的第七层, TCP 模型的第四层, 即应用层, 使用 TCP 传输而不是 UDP, 客户在和服务器建立连接前要经过一个“三次握手”的过程, 保证客户与服务器之间的连接是可靠的

    2024年02月14日
    浏览(32)
  • 上传本地文件到HDFS服务器

    在这篇文章中,我将详细介绍如何将本地文件上传到HDFS(分布式文件系统)服务器。我们将使用Hadoop命令行工具来完成这个任务。 首先,确保你已经安装了Hadoop并且HDFS服务器正在运行。接下来,我们将按照以下步骤进行操作: 步骤 1: 检查HDFS文件系统 在上传文件之前,我们

    2024年02月04日
    浏览(33)
  • Java实现以form-data形式文件上传到服务器

    Java实现以form-data形式文件上传到服务器

    2024年02月13日
    浏览(37)
  • windows本地上传文件到服务器(scp)

    1.ssh 用户名@ip:远程登录服务器。 2.scp 本地文件路径 用户名@ip:上传路径 :本地文件与服务器进行传递。 3.本地文件夹上传到服务器 4.查看当前文件夹下所有文件的权限 5.修改文件夹权限(777是最高权限) 注意:scp命令只适用于本机终端(比如cmd / powershell),或者是各种编

    2024年02月12日
    浏览(39)
  • 本地上传文件至阿里云服务器的方法

    1.通过阿里云自带的助手传输小文件至阿里云ECS服务器,编码后文件大小不能大于32KB   2.在云服务器中安装wps,可以查看上传的文件 3.远程登录阿里云服务器,在云服务器下载宝塔Windows安装,在云服务器输入宝塔网址:https://www.bt.cn/#

    2024年02月11日
    浏览(41)
  • mac PyCharm 上传文件到远程服务器+远程服务器下载到本地

    选择SFTP name:test6 输入ssh账号和密码。保存密码和30s心跳。 Local path(本地mac机器):/Users/clevercode/PycharmProjects/test6 Root path(远程服务机器):/home/clevercode/test6 Root path(远程服务机器):/home/clevercode/test6 [2024/1/18, 10:56 AM] Upload file ‘/Users/clevercode/PycharmProjects/test6/f100.py’ t

    2024年01月19日
    浏览(70)
  • vscode远程连接服务器(remote ssh)+上传本地文件到服务器(sftp)

    一、vscode远程连接服务器 1.点击vscode右边工具栏点击拓展,搜索remote ssh并安装 2.安装完成后,左边工具栏会出现一个电脑图标的远程资源管理器,点击后选择SSH TARGETS的设置 3.然后选择第一个..sshconfig 4.向服务器管理员索要服务器的连接信息并修改ssh config文件   5.设置完成

    2024年02月01日
    浏览(33)
  • 利用vscode工具从本地上传文件到服务器中

    首先,在vscode中安装SFTP扩展; 然后去配置sftp的传输信息,在vscode中按快捷键Ctrl+Shift+P或者点击下面图片的位置: 输入SFTP:Config(如下图),点击后会在此项目目录下生成一个sftp.json文件。 然后配置sftp.json文件中的信息就可以了: host:远程服务器的ip; port:远程服务器的端

    2024年04月13日
    浏览(28)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包