资讯专栏INFORMATION COLUMN

前后分离文件上传

AlexTuan / 2460人阅读

摘要:当时想的是用免费的第三方云存储解决方案,毕竟之前已经用过了七牛云。但是问题来了,免费的云存储,老是出问题。所以你如果自己玩,完全可以使用免费的云存储,要是真的商用,就考虑付费产品。

最近在做一个基于Flutter的app,算是学习新的移动端开发技术。于是就需要一个后端api接口,其中涉及到了文件上传,特此记录下
1.为什么自己写文件上传

本来我计划的是,后台只做数据接口,不做文件存储,毕竟自己也没那么多的服务器资源去存储。当时想的是用免费的第三方云存储解决方案,毕竟之前已经用过了七牛云。

但是问题来了,免费的云存储,老是出问题。比如七牛的,过段时间就会发现,外链访问文件会失效,而且后台文件管理面板,察看文件也看不了,很坑。

然后又看了有拍云,和腾讯云,它们提供的文件存储都不收费,但是要后收费,当你的文件存储超过容量时收费。这也还好,毕竟免费的,存储图片的话5g也够用了,但是主要是每天的流量由限制,超出流量收费。你后期不得面临你的应用中的图片全部不显示,作为定位上线的应用,是不能接受这种风险的。

所以你如果自己玩,完全可以使用免费的云存储,要是真的商用,就考虑付费产品。但是我又穷,所以只能自己写了。

2 后端开发(使用SpringBoot)

就不贴全部的项目代码了,只贴上传部分的。因为使用了静态资源访问,所以需要加入模板引擎依赖。


            org.springframework.boot
            spring-boot-starter-thymeleaf
        

因为代码比较简单,所以直接controller全部处理完:

package com.mike.controller;

import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.StandardCopyOption;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.CrossOrigin;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;

import com.mike.bean.ApiResult;
import com.mike.bean.FileView;
import com.mike.util.ApiUtils;
import com.mike.util.Tools;

/**
 * The class UploadController
 */
@RestController
@RequestMapping("/up")
public class UploadController {
    
    @Value("${baseUrl}")
    private String baaseUrl;
    
    @CrossOrigin
    @PostMapping("/upload")
    public ApiResult uploadFile(@RequestParam("file") MultipartFile file){
        if (file.isEmpty()) {
            return ApiUtils.err("你没有选择上传文件");
        } else if(file.getOriginalFilename().contains("..")||!file.getOriginalFilename().contains(".")){
            return ApiUtils.err("文件格式有误");
        } else {
            String fileName = file.getOriginalFilename();
            //为防止文件名重复覆盖
            fileName = fileName.replace(".", System.currentTimeMillis()+".");
            Path savePath = Paths.get("src/main/resources/static/upload");
            try {
                Files.copy(file.getInputStream(), savePath.resolve(fileName), StandardCopyOption.REPLACE_EXISTING);
                FileView view = new FileView();
                view.setName(fileName);
                view.setSize(file.getSize());
                view.setUrl(baaseUrl+fileName);
                view.setUploadDate(Tools.getCurrent());
                return ApiUtils.success(view);
            } catch (IOException e) {
                e.printStackTrace();
                return ApiUtils.err("对不起,上传失败");
            }
        }
    }
}

在高并发下,还是有非常小的几率出现文件重名,所以使用时间戳也不是好的解决方案。需要能够生成唯一识别符号,建议使用UUId。

3 前端测试(使用jquery ajax)


  
    
    
  
  

     

     

      
        
  

效果:

访问上传后的图片url:

4 填坑

因为图片上传导了代码目录,不是服务器的目录,所以,新上传得图片访问会报404,需要重起才能访问。为了解决这个问题,我们需要增加文件与路径的映射关系,这样,就不会出现404

public class FileConfig implements WebMvcConfigurer {
    
    @Value("${serverFilePath}")
    private String serverFilePath;
    
    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        WebMvcConfigurer.super.addResourceHandlers(registry);
        registry.addResourceHandler("/upload/**")
                .addResourceLocations(serverFilePath);
    }
}

serverFilePath 在properties中配置:

baseUrl=http://localhost:8080/upload/
serverFilePath=file:C:/code/mike-todo/src/main/resources/static/upload/

上线的话,换成服务器上的路径就好。

5 总结

文件存储,远远不像我写的这么简单。只是应付一般小项目足够了,如果是大型的项目,就需要专门的文件存储系统以及服务器端的优化。如果你有什么问题,可以留言要论。或是关注我的公众号:mike啥都想搞,还有其他教学视频免费领取。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/110179.html

相关文章

  • 前后分离文件上传

    摘要:当时想的是用免费的第三方云存储解决方案,毕竟之前已经用过了七牛云。但是问题来了,免费的云存储,老是出问题。所以你如果自己玩,完全可以使用免费的云存储,要是真的商用,就考虑付费产品。 最近在做一个基于Flutter的app,算是学习新的移动端开发技术。于是就需要一个后端api接口,其中涉及到了文件上传,特此记录下 1.为什么自己写文件上传 本来我计划的是,后台只做数据接口,不做文件存储,...

    cheukyin 评论0 收藏0
  • 浅析前端上传

    摘要:项目上也用到很多上传文件的地方,七牛云,阿里云,讯飞上传都接触过,所以在这里做一个记录,总结一下前端上传的几种方式。类型的文件名七牛云上传浅析是一个基于七牛开发的前端。 showImg(https://segmentfault.com/img/bVbvibu?w=1920&h=1080); 图片,音频,视频等等这几种常见的资源类型,如果需要从前端上传到服务端,有几种方式呢?不妨回顾一下...

    terro 评论0 收藏0
  • 两年了,我写了这些干货!

    摘要:开公众号差不多两年了,有不少原创教程,当原创越来越多时,大家搜索起来就很不方便,因此做了一个索引帮助大家快速找到需要的文章系列处理登录请求前后端分离一使用完美处理权限问题前后端分离二使用完美处理权限问题前后端分离三中密码加盐与中异常统一处理 开公众号差不多两年了,有不少原创教程,当原创越来越多时,大家搜索起来就很不方便,因此做了一个索引帮助大家快速找到需要的文章! Spring Boo...

    huayeluoliuhen 评论0 收藏0
  • ONE-sys 整合前后端脚手架 koa2 + pm2 + vue-cli3.0 + element

    摘要:项目地址干货求本脚手架主要致力于前端工程师的快速开发一键部署等快捷开发框架,主要目的是想让前端工程师在一个阿里云服务器上可以快速开发部署自己的项目。 项目地址https://github.com/fanshyiis/... 干货!求star showImg(https://segmentfault.com/img/remote/1460000017886870); 本脚手架主要致力于...

    刘福 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<