简单易懂SpringBoot和Android上传和下载文件方案——采用URL

2023-11-04

上传思路

  1. SpringBoot把文件保存在静态资源里,并且开启静态资源访问
  2. 数据库保存文件的URL地址(URL地址是一个字符串)
  3. Android采用OkHttp上传文件

下载思路

  1. SpringBoot从数据库获取URL地址发送给Android
  2. Android利用URL地址下载文件

上传关键代码

  1. Android
    /**
        上传文件代码
     * @param url 请求服务器路径
     * @param filePath
     * @param fileName
     * @param listener 回调函数
     */
    public void upload(String url,String filePath, String fileName, Callback listener){
        new Thread(new Runnable() {
            @Override
            public void run() {
                RequestBody requestBody = new MultipartBody.Builder()
                        .setType(MultipartBody.FORM)
                        .addFormDataPart("file", fileName,
                                RequestBody.create(MediaType.parse("multipart/form-data"), new File(filePath)))
                        .build();
                    Request request = new Request.Builder()
                            .url(baseURL + url)
                            .post(requestBody)
                            .build();
                    client.newCall(request).enqueue(listener);
            }
        });
    }
  1. SpringBoot
    @PostMapping("/save")
    public void save(MultipartFile file, HttpServletRequest request) throws IOException {
        // 保存文件目录,在静态资源里
        File path = ResourceUtils.getFile("classpath:");
        File uploadDir = new File(path.getAbsolutePath(),"static/file/");
        if(!uploadDir.exists())
        {
            uploadDir.mkdirs();
        }
        log.info("文件目录:" +  uploadDir.getAbsolutePath());
        // 保存文件路径
        String fileName = UUID.randomUUID() + file.getOriginalFilename();
        String filePath = uploadDir.getAbsolutePath() + "\\" + fileName ;
        log.info("文件保存路径:" + filePath);
        // 保存文件
        File saveFile = new File(filePath);
        file.transferTo(saveFile);
        // 保存文件信息到数据库,自己根据表保存
        // 文件名
        String dataFileName = file.getOriginalFilename();
        // RUL地址
        String fileAddress = request.getScheme() + "://" + request.getServerName() + ":" + request.getServerPort() + request.getContextPath() + "/static/file/"  + fileName;
        return ;
    }

记得开启静态资源访问

@Configuration
public class WebMvcConfig extends WebMvcConfigurationSupport {
    /**
     * 配置静态资源
     * @param registry
     */
    @Override
    protected void addResourceHandlers(ResourceHandlerRegistry registry) {
        registry.addResourceHandler("/static/**").addResourceLocations("classpath:/static/");
        super.addResourceHandlers(registry);
    }

}

下载文件关键代码

  1. SpringBoot

返回保存在数据库的URL地址和文件名

  1. Android
 // 网络操作采用子线程
                new Thread(new Runnable(){
                    @Override
                    public void run() {
                        URL url = null;
                        try {
                        // fileAddress是从后端返回的RUL地址
                            url = new URL(fileAddress);
                            InputStream inputStream = url.openStream();
                            // 文件保存目录路径
                            String dirName = parentContext.getExternalFilesDir(null).getPath() + "/MyDownLoad/";
                            // 文件目录
                            File fileDir = new File(dirName);
                            //目录不存在创建
                            if (!fileDir.exists()) {
                                boolean is = fileDir.mkdirs();
                                Log.d("FileAdapter.class", "创建目录是否成功:" + is);
                            }
                            // 文件路径  dataFileName是后端放回的文件名
                            String fileName = dirName + dataFileName;
                            File file = new File(fileName);
                            if(file.exists()){
                                file.delete();
                            }
                            // 创建文件
                            boolean is = file.createNewFile();
                            Log.d("FileAdapter.class", "创建文件是否成功:" + is);
                            // 写文件数据
                            //创建字节流
                            byte[] bs = new byte[1024];
                            int len;
                            OutputStream os = new FileOutputStream(fileName);
                            //写数据
                            while ((len = inputStream.read(bs)) != -1) {
                                os.write(bs, 0, len);
                            }
                            //完成后关闭流
                            os.close();
                            inputStream.close();
                        } catch (IOException e) {
                            e.printStackTrace();
                        }
                    }
                }).start();
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

简单易懂SpringBoot和Android上传和下载文件方案——采用URL 的相关文章

随机推荐

  • 如何学习html?

    怎么学习html 本文为html初学者介绍一些高效率的html学习办法 以及推荐一些不错的HTML学习资源给我们 希望能帮助到我们 怎么学习html html即超文本标记语言 现在大部分网页都是html格式 html代码也是一切编程语言中学
  • vim后,/要搜索字段,n(查找)

    vim后 要搜索字段 回车 n 查找
  • 测试测试测试

    目录 标题 标题 测试
  • Mysql索引

    1 什么是索引 索引是帮助MySQL高效获取数据的数据结构 2 索引的分类 单列索引 1 普通索引 mysql中的普通索引 允许插入重复值和null值 没有什么限制 纯粹为了查询快一点 2 唯一索引 索引中的列必须是唯一的 可以为null值
  • oracle 不带时分秒,关于Oracle数据库不带日期中时分秒的查询

    关于Oralce数据库 的日期时间查询 下面我们先来看一组日期数据 表 myDate 列 time 1998 8 7 23 45 33 3 1998 8 7 11 22 21 5 1998 8 7 00 00 00 0 上面列出的这组日期数
  • 50-00-010-配置-kylin-2.6.0官网配置

    文章目录 1 视界 1 Kylin 配置 2 配置文件及参数重写 3 Kylin 配置文件 配置重写 项目级别配置重写 Cube 级别配置重写 MapReduce 任务配置重写 Hive 任务配置重写 Spark 任务配置重写 部署配置 部
  • linux下部分文件管理类基本命令汇总以及bash展开特性介绍

    一 文件管理类基本命令 1 1 表格汇总 今天要讲解的命令如下表所示 按照外部命令和内建命令做基本划分 内建命令列表 命令名字 基本说明 file 检测文件类型 cd 改变shell的工作目录 dirs 显示目录堆栈信息 popd 从堆栈中
  • macOS_Monterey_12.6_21G115可引导可虚拟机安装的纯净版苹果OS系统ISO镜像安装包免费下载

    现在网络上黑果系统出现了许多多合一的多功能版 不是说这些版本不好 只是小编个人觉得 操作系统就是用来使用的 黑果本来就是服务于一些非苹果机的苹果OS爱好者的 简洁稳定应该是首选 固小编毅然放弃那些多功能的豪华版镜像版 独宠我的纯净可引导安装
  • pyqt5重温入门教程:用Qt Designer设计UI

    程序员今晚不回家 抖音号 在开始教程之前 先简单地水几句 之前使用过pyqt5 但是好久没用了 现在因为有一个项目需要 所以在此重温一下 当然教程就不是像零基础那样手把手从安装开始了 这里简洁明了 直接上手操作 第一步 打开Designer
  • 某宝sign参数逆向分析

    说明 淘宝ajax获取数据的方式为jsonp请求 所以在chrome中使用xhr拦截请求中加密参数的方式拦截不到 解决办法 目前我使用的方法是 添加DOM断点的方法去监听页面元素的变化 同时使用charles去监听页面发送的请求 后面就是一
  • 简单粗暴而又很有效果的图片无损放大方法

    工作生活中我们都会碰到想要对图片进行无损放大的情况 比如说做电子相册视频啦 做PPT啦 做设计啦等等等等 但是我们又没有那么专业的技术 PS也能试着操作一下 但始终没法弄能自己想要的效果 我们该如何对图片进行快速的无损放大呢 用PhotoZ
  • uart_linux

    写串口程序 include
  • vue.js中props,watch深度监听对象时,对象新增或者删除属性值时深度监听失效

    使用 deep 选项时 仅会监听对象内部现有属性值的改变 不会监听对象属性的增加或删除操作 原因是 deep 选项仅能监听对象内部属性的改变 当对象新增或删除属性时 这些操作并不会触发属性内部变化引起的更新 解决方案1 this obj O
  • DTFD-MIL: Double-Tier Feature Distillation Multiple Instance Learning for WSI_论文笔记

    文章链接 https arxiv org pdf 2203 12081 pdf 一 摘要 多实例学习 MIL 在组织病理学全切片图像分类中的应用越来越广泛 然而 用于这一特定分类问题的MIL方法仍然面临着独特的挑战 特别是那些与小样本队列相
  • antd4 tree带搜索框的可编辑树实现(hooks+ts)

    需求背景 实现带搜索框的可编辑树 有以下功能在 1 搜索相关节点高亮 2 配合treeSelect规范数据处理 3 节点可添加和编辑 编辑可修改上级 4 节点可删除 5 移入显示编辑图标 0 带搜索框的树 默认数据 搜索exa后 搜索exa
  • c#中的queue和stack

    using System using System Collections 队列Queue的using引用 using System Collections Generic using System Linq using System Te
  • JAVA基础

    目录 1 数据类型 2 注释模式 3 进制 4 浮点数拓展 5 字符拓展 6 运算中不同类型的数据先转化同一类型然后进行运算 7 变量 8 运算符 9 包机制 1 数据类型 强类型语言 变量必须定义才能使用 public class Dem
  • 这几款软件,你千万别装

    目录 写在前面 一 鲁大师 旧版 二 360全家桶 三 2345全家桶 四 快压 结束语 写在前面 很多人都会在自己的电脑上装上Ghost Windows 其实这样并不好 虽然不用激活 但是也有很多的捆绑软件 今天我就为大家盘点一下哪些软件
  • Android8打印功能,[翻译]Android 8.1 默认打印服务的中间人攻击漏洞披露

    漏洞概述 Android 8 1引入了默认打印服务 默认打印服务 基于Mopria联盟在谷歌应用商店发布的免费应用 Mopria Print Service 因其缺乏验证 所以会导致中间人攻击并被拦截后续的打印作业 还会造成在使用潜在不安全
  • 简单易懂SpringBoot和Android上传和下载文件方案——采用URL

    上传思路 SpringBoot把文件保存在静态资源里 并且开启静态资源访问 数据库保存文件的URL地址 URL地址是一个字符串 Android采用OkHttp上传文件 下载思路 SpringBoot从数据库获取URL地址发送给Android