热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

开发笔记:android+springboot选择,上传,下载文件

篇首语:本文由编程笔记#小编为大家整理,主要介绍了android+spring boot 选择,上传,下载文件相关的知识,希望对你有一定的参考价值。 目录

篇首语:本文由编程笔记#小编为大家整理,主要介绍了android+spring boot 选择,上传,下载文件相关的知识,希望对你有一定的参考价值。




目录




  • 1 概述

  • 2 环境

  • 3 android

    • 3.1 准备工作

      • 3.1.1 新建工程

      • 3.1.2 AndroidManifest.xml

      • 3.1.3 build.gradle

      • 3.1.4 上传文件

      • 3.1.5 布局


    • 3.2 选择文件

      • 3.2.1 申请权限

      • 3.2.2 Intent选择文件


    • 3.3 上传文件

    • 3.4 下载文件


  • 4 Spring Boot

    • 4.1 准备工作

      • 4.1.1 新建工程

      • 4.1.2 application.properties

      • 4.1.3 pom.xml


    • 4.2 处理上传文件

    • 4.3 处理下载文件


  • 5 测试

    • 5.1 postman测试

      • 5.1.1 上传测试

      • 5.1.2 下载测试


    • 5.2 android端测试

      • 5.2.1 上传测试

      • 5.2.2 下载测试



  • 6 部署到服务器

    • 6.1 部署

      • 6.1.1 改变打包方式

      • 6.1.2 去除tomcat依赖

      • 6.1.3 修改Main

      • 6.1.4 修改路径

      • 6.1.5 设置打包名字

      • 6.1.6 打包

      • 6.1.7 上传到服务器

      • 6.1.8 运行


    • 6.2 测试

      • 6.2.1 postman测试

      • 6.2.2 android端测试



  • 7 最最最喜欢的

    • 7.1 权限

    • 7.2 路径

    • 7.3 有关http的问题

      • 7.3.1 okhttp的stream关闭

      • 7.3.2 http

      • 7.3.3 线程

      • 7.3.4 AVD


    • 7.4 ip

    • 7.5 判空处理


  • 8 源码




1 概述

前端android,上传与下载文件,使用OkHttp处理请求,后端使用spring boot+MVC,处理android发送来的上传与下载请求.这个其实不难,就是特别多奇奇怪怪的坑,因此,希望看到的,不要像笔者这样踩的那么痛苦了...


2 环境

  • win10

  • Spring Boot 2.2.2 RELEASE

  • IDEA 2019.3.1

  • Android Studio 3.6RC1

  • Tomcat 9.0.30


3 android

3.1 准备工作


3.1.1 新建工程

这次用一个全新的例子写博客,因此从新建工程开始:

技术图片

技术图片


3.1.2 AndroidManifest.xml

加入






网络权限,读写SD卡权限,当然还有允许http请求的权限.


3.1.3 build.gradle

加入

compileOptions {
sourceCompatibility = 1.8
targetCompatibility = 1.8
}

这个是支持JDK8的.

还有这两个okhttp与conscrypt,最新版本okhttp可以在这里查看,最新版本conscrypt在这里:

implementation 'com.squareup.okhttp3:okhttp:4.3.1'
implementation 'org.conscrypt:conscrypt-android:2.2.1'

3.1.4 上传文件

手动上传一些文件到AVD设备,为下一步选择与上传文件做准备,先把这个窗口工具栏打开:

技术图片

打开后,打开在右侧栏中的Device File Explorer:

技术图片

然后选择sdcard文件夹上传文件即可,其他文件夹一般没有权限.

技术图片


3.1.5 布局

添加三个button(上传/下载/选择文件),一个EditText(上传文件名与下载文件名),一个ImageView(显示下载的图片).

技术图片

直接拖放改一下id.


3.2 选择文件


3.2.1 申请权限

首先申请动态读写文件权限(其实选择文件只需要读权限,因为后面的下载需要写权限所以这里就一起申请了):

技术图片

使用checkSelfPermission检查权限,参数为一个Context与String,String表示相应的权限,如果有了这个权限就会返回

PackageManager.PERMISSION_GRANTED

没有就会返回

PackageManager.PERMISSION_DENIED

没有就利用requestPermissions()申请,参数为Content,String[],int,String[]表示要申请的所有权限,int是一个requestCode.


3.2.2 Intent选择文件

技术图片

新建一个Intent后,设置选择类型,然后就重写onActivityResult:

技术图片

这是简化了的处理,因为选择的是图片,选择其他文件的话可以参照这里.

其中path是选择的文件的路径,可能你会问:

String path = dir.toString().substring(0,dir.toString().indexOf("0")+2) +
DocumentsContract.getDocumentId(uri).split(":")[1];

这个是怎么来的,其实是拼凑过来的,因为这是图片,是这个的简化版:

技术图片

(博客在这里)


3.3 上传文件

技术图片

参数为文件路径与文件名,然后使用OkHttpClient,因为是文件,用的body是MultipartBody,增加一个叫file的FormDataPart与一个叫filename的FormDataPart.然后使用execute()发送请求,body()获取响应内容,这里假设了后端响应一个布尔,表示上传成功或失败,url的话使用了本地的路径,注意不能是localhost,使用内网ip,然后还要与后端对应.


3.4 下载文件

技术图片

参数为一个文件名,根据这个文件名返回对应的文件,返回一个File,这里请求体可以选择FormBody或MultipartBody,因为这是一个文件名参数,这里笔者为了统一就选择了MultipartBody,使用FormBody的话,只需要将RequestBody的那一行改为:

RequestBody body = new FormBody.Builder().add("filename",filename).build();

有了请求体后发送请求获取响应体,进而获取输入流,然后首先需要判断是否为空,但不能直接这样判断:

inputStream == null

因为后端是这样的:

技术图片

从响应体获取的inputStream肯定不为null,需要先进行一次读取(也就是判断里面的文件是否为null),若为null的话删除这个文件,不为null的话继续读取并写入文件.


4 Spring Boot

4.1 准备工作

用的是IDEA,其他IDE请自行搜索如何新建一个SpringBoot工程.


4.1.1 新建工程

技术图片

打包的话可以jar或war,不用部署的话jar即可,要部署的话后期也可以改成war.

技术图片

两个,一个Spring Web,用于MVC等,一个模板引擎,用于显示视图,如果不需要显示可以不选.

技术图片


4.1.2 application.properties

作为一个示例demo,属性就直接在application.properties中配置了,实际情况请在相应的配置文件中配置相应属性.

技术图片

需要配置上传文件的大小限制与上传文件夹的路径.


4.1.3 pom.xml

这里其实不需要干什么,只是如果下载依赖慢的话,可以这样设置settings.xml文件,在中加上:


alimaven
aliyun maven
http://maven.aliyun.com/nexus/content/groups/public/
central


uk
central
Human Readable Name for this Mirror.
http://uk.maven.org/maven2/


CN
OSChina Central
http://maven.oschina.net/content/groups/public/
central


nexus
internal nexus repository

http://repo.maven.apache.org/maven2
central

windows用户的话这个文件在

C:Users{username}.m2settings.xml

linux的话在

~/.m2/settings.xml

4.2 处理上传文件

技术图片

首先对应的post映射路径为/upload,与android端的路径对应,然后需要一个表示文件的MultipartFile与一个表示文件名的String,判断这两个是否为空后,如果上传的文件夹不存在则先创建,存在的话直接进行复制,然后根据复制成功或失败返回布尔值.复制使用了Files.copy(),第一个InputStream为上传文件的输入流,第二个Path为存储文件的路径,resolve(filename)相当于在上传目录下的filename文件.输出的话建议使用日志代替.


4.3 处理下载文件

下载的话可以选择使用get或post请求,这里选择了post请求,因为android端是post请求,需要对应.get请求的话可以从浏览器发起.

技术图片

首先根据文件名获取对应文件,判断文件是否存在后返回一个ResponseEntity,需要设定content-type与body,content-type根据需要设置即可,这里是图片,默认.jpg或.png,body的话使用FileSystemResource,直接new一个放进body即可.

如果不存在相应的文件则返回null,这里需要注意一下前端的判断,不能直接判断ResponseBody是否为null.


5 测试

5.1 postman测试

postman只能测试与后端的连接,上传等是否有问题,可以用来定位后端的问题.


5.1.1 上传测试

再Headers中设置了Content-Type为multipart/form-data后:

技术图片

在body添加一个叫file的文件与一个叫filename的字符串表示文件名:

技术图片

发送,返回true.

技术图片

服务器端有输出提示:

技术图片

查看文件夹:

技术图片


5.1.2 下载测试

把file参数关掉,保留filename,修改路径.

技术图片

然后发送,postman可以直接显示图片:

技术图片


5.2 android端测试


5.2.1 上传测试

技术图片

后端提示:

技术图片

查看文件夹:

技术图片


5.2.2 下载测试

输入文件名后直接下载:

技术图片

默认的话是放在这里,按需要更改位置即可,注意加上写权限:

技术图片

若看不到文件选择synchronize即可.

技术图片


6 部署到服务器

服务器用的是tomcat,需要修改一些Spring Boot的部分.


6.1 部署


6.1.1 改变打包方式

pom.xml中jar改成war.

技术图片


6.1.2 去除tomcat依赖

pom.xml加入:


org.springframework.boot
spring-boot-starter-tomcat
provided

6.1.3 修改Main

修改Main类,让其继承SpringBootServletInitializer,重载configure(),同时main()保持不变.

修改前:

技术图片

修改后:

技术图片


6.1.4 修改路径

这个按需要修改即可,在这里不需要,注意就是@PostMapping,@GetMapping等都是相对于

tomcat/webapps/项目/

目录下的.


6.1.5 设置打包名字

build加上.

技术图片


6.1.6 打包

技术图片


6.1.7 上传到服务器

打包后的文件放在target下,使用scp上传即可,这里是本地的tomcat,就这接移动war了.


6.1.8 运行

开启tomcat,双击startup.bat即可.

技术图片

linux的话:

cd xxxx/tomcat/bin
./startup.sh

6.2 测试

在测试前需要确保没有占用相应端口,默认8080,也就是说,如果不改端口的话,需要关闭IDEA运行中的SpringBoot应用.


6.2.1 postman测试

上传测试,注意需要改路径,加上打包项目名,ip的话可以使用localhost或者内网ip.

技术图片

服务器这边收到了,因为上传路径只是直接写名字,因此会与startup.bat同一路径.

技术图片

下载测试:

技术图片

服务器的输出:

技术图片


6.2.2 android端测试

android端需要修改路径即可,加上war打包的名字.

技术图片

这里打包的名字是kr,直接加上即可.

技术图片

上传那里也是要加上,然后:

技术图片

服务器的输出:

技术图片

查看文件:

技术图片


7 最最最喜欢的

7.1 权限

android需要读权限才能读取文件并上传,需要写权限才能保存从服务器返回的文件,在AndroidManifest.xml中加入:

...


...

这是外部设备的读写权限.当然,加入这个还不能访问,因为,android6.0以后还需要动态申请权限,所以:

String [] permission = new String[]{
"android.permission.READ_EXTERNAL_STORAGE",
"android.permission.WRITE_EXTERNAL_STORAGE"
};
if(
ActivityCompat.checkSelfPermission(this,permission[0]) != PackageManager.PERMISSION_GRANTED
||
ActivityCompat.checkSelfPermission(this,permission[1]) != PackageManager.PERMISSION_DENIED
)
{
ActivityCompat.requestPermissions(this,permission,1);
}

7.2 路径

需要保证下面几个路径正确,还有可读,可写等:



  • url路径不能错.

  • 前端上传文件的路径.

  • 后端接收前端上传文件的路径.

  • 后端发送前端需要下载的文件的路径.

  • 前端接收下载文件的路径.


7.3 有关http的问题


7.3.1 okhttp的stream关闭

技术图片

若前端是这样写的,在工具类中返回了之后Response已经关闭,因此需要读取输入流之类的需要先读取再返回,而不是返回一个ResponseBody或InputStream进行读取,否则会提示"closed".


7.3.2 http

Android P开始默认禁用http,因此可以使用https或者在AndroidManifest.xml中允许http连接:


7.3.3 线程

网络请求不能在主线程中,新开一个线程即可.


7.3.4 AVD

若检查过了服务器与android端没问题,那么有可能是AVD的问题,解决方法很简单,卸载,重启AVD,注意一定要卸载再重启.


7.4 ip

在本地测试的话后端可以直接localhost,在android端不能直接localhost,可以使用ipconfig或ifconfig查看内网ip,输入内网ip即可.

技术图片

若在服务器上测试直接使用服务器ip.


7.5 判空处理

对于前端,应该判断存储路径是否为空,是否为null等,再传给后端,对于后端,要判断文件是否存在等,不存在就返回null,这时又需要前端进行判断返回的null,在下载文件时,虽然对不存在的文件后端返回null,但是,前端收到的是一个InputStream,不能直接判断是否为null,需要先读取一次,再进行剩下的读取:

技术图片


8 源码

github

码云


推荐阅读
  • 如何将TS文件转换为M3U8直播流:HLS与M3U8格式详解
    在视频传输领域,MP4虽然常见,但在直播场景中直接使用MP4格式存在诸多问题。例如,MP4文件的头部信息(如ftyp、moov)较大,导致初始加载时间较长,影响用户体验。相比之下,HLS(HTTP Live Streaming)协议及其M3U8格式更具优势。HLS通过将视频切分成多个小片段,并生成一个M3U8播放列表文件,实现低延迟和高稳定性。本文详细介绍了如何将TS文件转换为M3U8直播流,包括技术原理和具体操作步骤,帮助读者更好地理解和应用这一技术。 ... [详细]
  • 基于Net Core 3.0与Web API的前后端分离开发:Vue.js在前端的应用
    本文介绍了如何使用Net Core 3.0和Web API进行前后端分离开发,并重点探讨了Vue.js在前端的应用。后端采用MySQL数据库和EF Core框架进行数据操作,开发环境为Windows 10和Visual Studio 2019,MySQL服务器版本为8.0.16。文章详细描述了API项目的创建过程、启动步骤以及必要的插件安装,为开发者提供了一套完整的开发指南。 ... [详细]
  • Java Socket 关键参数详解与优化建议
    Java Socket 的 API 虽然被广泛使用,但其关键参数的用途却鲜为人知。本文详细解析了 Java Socket 中的重要参数,如 backlog 参数,它用于控制服务器等待连接请求的队列长度。此外,还探讨了其他参数如 SO_TIMEOUT、SO_REUSEADDR 等的配置方法及其对性能的影响,并提供了优化建议,帮助开发者提升网络通信的稳定性和效率。 ... [详细]
  • Spring框架中枚举参数的正确使用方法与技巧
    本文详细阐述了在Spring Boot框架中正确使用枚举参数的方法与技巧,旨在帮助开发者更高效地掌握和应用枚举类型的数据传递,适合对Spring Boot感兴趣的读者深入学习。 ... [详细]
  • 深入探索HTTP协议的学习与实践
    在初次访问某个网站时,由于本地没有缓存,服务器会返回一个200状态码的响应,并在响应头中设置Etag和Last-Modified等缓存控制字段。这些字段用于后续请求时验证资源是否已更新,从而提高页面加载速度和减少带宽消耗。本文将深入探讨HTTP缓存机制及其在实际应用中的优化策略,帮助读者更好地理解和运用HTTP协议。 ... [详细]
  • 本文详细介绍了一种利用 ESP8266 01S 模块构建 Web 服务器的成功实践方案。通过具体的代码示例和详细的步骤说明,帮助读者快速掌握该模块的使用方法。在疫情期间,作者重新审视并研究了这一未被充分利用的模块,最终成功实现了 Web 服务器的功能。本文不仅提供了完整的代码实现,还涵盖了调试过程中遇到的常见问题及其解决方法,为初学者提供了宝贵的参考。 ... [详细]
  • 如何使用 `org.apache.tomcat.websocket.server.WsServerContainer.findMapping()` 方法及其代码示例解析 ... [详细]
  • 本文探讨了如何通过编程手段在Linux系统中禁用硬件预取功能。基于Intel® Core™微架构的应用性能优化需求,文章详细介绍了相关配置方法和代码实现,旨在帮助开发人员有效控制硬件预取行为,提升应用程序的运行效率。 ... [详细]
  • 本文深入解析了WCF Binding模型中的绑定元素,详细介绍了信道、信道管理器、信道监听器和信道工厂的概念与作用。从对象创建的角度来看,信道管理器负责信道的生成。具体而言,客户端的信道通过信道工厂进行实例化,而服务端则通过信道监听器来接收请求。文章还探讨了这些组件之间的交互机制及其在WCF通信中的重要性。 ... [详细]
  • MATLAB字典学习工具箱SPAMS:稀疏与字典学习的详细介绍、配置及应用实例
    SPAMS(Sparse Modeling Software)是一个强大的开源优化工具箱,专为解决多种稀疏估计问题而设计。该工具箱基于MATLAB,提供了丰富的算法和函数,适用于字典学习、信号处理和机器学习等领域。本文将详细介绍SPAMS的配置方法、核心功能及其在实际应用中的典型案例,帮助用户更好地理解和使用这一工具箱。 ... [详细]
  • 在本文中,我们将详细介绍如何构建一个用于自动回复消息的XML类。当微信服务器接收到用户消息时,该类将生成相应的自动回复消息。以下是具体的代码实现:```phpclass We_Xml { // 代码内容}```通过这个类,开发者可以轻松地处理各种消息类型,并实现高效的自动回复功能。我们将深入探讨类的各个方法和属性,帮助读者更好地理解和应用这一技术。 ... [详细]
  • 在处理 XML 数据时,如果需要解析 `` 标签的内容,可以采用 Pull 解析方法。Pull 解析是一种高效的 XML 解析方式,适用于流式数据处理。具体实现中,可以通过 Java 的 `XmlPullParser` 或其他类似的库来逐步读取和解析 XML 文档中的 `` 元素。这样不仅能够提高解析效率,还能减少内存占用。本文将详细介绍如何使用 Pull 解析方法来提取 `` 标签的内容,并提供一个示例代码,帮助开发者快速解决问题。 ... [详细]
  • 本文探讨了如何利用Java代码获取当前本地操作系统中正在运行的进程列表及其详细信息。通过引入必要的包和类,开发者可以轻松地实现这一功能,为系统监控和管理提供有力支持。示例代码展示了具体实现方法,适用于需要了解系统进程状态的开发人员。 ... [详细]
  • 2018 HDU 多校联合第五场 G题:Glad You Game(线段树优化解法)
    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6356在《Glad You Game》中,Steve 面临一个复杂的区间操作问题。该题可以通过线段树进行高效优化。具体来说,线段树能够快速处理区间更新和查询操作,从而大大提高了算法的效率。本文详细介绍了线段树的构建和维护方法,并给出了具体的代码实现,帮助读者更好地理解和应用这一数据结构。 ... [详细]
  • 在Java Web服务开发中,Apache CXF 和 Axis2 是两个广泛使用的框架。CXF 由于其与 Spring 框架的无缝集成能力,以及更简便的部署方式,成为了许多开发者的首选。本文将详细介绍如何使用 CXF 框架进行 Web 服务的开发,包括环境搭建、服务发布和客户端调用等关键步骤,为开发者提供一个全面的实践指南。 ... [详细]
author-avatar
缤纷之铃6868
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有