安卓文件上传照片单张及多张照片上传实现
一、首先导入对应库
//网络请求库
implementation 'com.squareup.okhttp3:okhttp:3.9.0'//Gson解析
implementation 'com.google.code.gson:gson:2.10.1'
二、然后就是们实现上传方法 UploaderTool.java
import android.util.Log;import com.google.gson.Gson;import java.io.File;
import java.io.IOException;
import java.util.List;
import java.util.concurrent.CountDownLatch;import okhttp3.MediaType;
import okhttp3.MultipartBody;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.RequestBody;
import okhttp3.Response;
import okhttp3.ResponseBody;/*** 文件上传网络请求封装*/
public class UploaderTool {public interface UploadFileCallback {void onResponse(String url);void onFailure(String error);}private static final OkHttpClient client = new OkHttpClient();/*** 照片上传* @param serverUrl 服务器地址* @param token 令牌token* @param filePaths 文件路径,这支持多个文件* @param callback 回调*/public static void uploadFile(final String serverUrl, String token, List<String> filePaths, final UploadFileCallback callback) {final CountDownLatch latch = new CountDownLatch(filePaths.size());for (String filePath : filePaths) {if (filePath == null) {latch.countDown();if (callback != null) {callback.onFailure("文件路径为空");return;}}File file = new File(filePath);if (!file.exists() || file.isDirectory()) {latch.countDown();if (callback != null) {callback.onFailure("文件未找到或是一个目录: " + filePath);return;}} else {MediaType mediaType = MediaType.parse("application/octet-stream");RequestBody fileBody = RequestBody.create(mediaType, file);MultipartBody.Builder builder = new MultipartBody.Builder().setType(MultipartBody.FORM);builder.addFormDataPart("file", file.getName(), fileBody);RequestBody requestBody = builder.build();// 在构建 Request 对象时添加 token 参数到请求头部Request request = new Request.Builder().url(serverUrl).addHeader("Authorization", token).post(requestBody).build();client.newCall(request).enqueue(new okhttp3.Callback() {@Overridepublic void onFailure(okhttp3.Call call, IOException e) {latch.countDown();if (callback != null) {callback.onFailure("Exception: " + e.toString());}}@Overridepublic void onResponse(okhttp3.Call call, Response response) throws IOException {try (ResponseBody responseBody = response.body()) {if (!response.isSuccessful() || responseBody == null) {latch.countDown();if (callback != null) {callback.onFailure("Upload failed: " + response);}} else {String responseStr = responseBody.string();Gson gson = new Gson();FileBen fileBen = gson.fromJson(responseStr, FileBen.class);Log.d("解析服务器返回的结果:", responseStr);try {callback.onResponse(fileBen.getUrl());} finally {latch.countDown();}}}}});}}}
}
这里我把返回实体一起给出,具体实体已自己项目为准 FileBen.java
package com.example.registrationsystem_android.personal;public class FileBen {/*** msg : 操作成功* fileName : /profile/upload/2024/04/16/avatar_20240416013601A002.jpg* code : 200* newFileName : avatar_20240416013601A002.jpg* url : http://test-api.setvoid.com:8080/profile/upload/2024/04/16/avatar_20240416013601A002.jpg* originalFilename : avatar.jpg*/private String msg;private String fileName;private int code;private String newFileName;private String url;private String originalFilename;public String getMsg() {return msg;}public void setMsg(String msg) {this.msg = msg;}public String getFileName() {return fileName;}public void setFileName(String fileName) {this.fileName = fileName;}public int getCode() {return code;}public void setCode(int code) {this.code = code;}public String getNewFileName() {return newFileName;}public void setNewFileName(String newFileName) {this.newFileName = newFileName;}public String getUrl() {return url;}public void setUrl(String url) {this.url = url;}public String getOriginalFilename() {return originalFilename;}public void setOriginalFilename(String originalFilename) {this.originalFilename = originalFilename;}
}
最后就是调用了,调用方式,在我们Fragment或者Activity中直接调用即可
例如下
private void setAvatarUploadData(String path) {String user_img_path = ImageCompressor.compressImage(PersonalInfoActivity.this, path);List<String> filePaths = new ArrayList<>();filePaths.add(user_img_path);UploaderTool.uploadFile(Constants.getHost() + "/common/upload", User.getInstance(PersonalInfoActivity.this).getToken(), filePaths, new UploaderTool.UploadFileCallback() {@Overridepublic void onResponse(String url) {Log.d("选择上传的照片,", url);}@Overridepublic void onFailure(String error) {ToastUtils.ShowToast(PersonalInfoActivity.this, error);}});}
相关文章:
安卓文件上传照片单张及多张照片上传实现
一、首先导入对应库 //网络请求库 implementation com.squareup.okhttp3:okhttp:3.9.0//Gson解析 implementation com.google.code.gson:gson:2.10.1 二、然后就是们实现上传方法 UploaderTool.java import android.util.Log;import com.google.gson.Gson;import java.io.File…...
小白学webgl合集-import.meta.url 和 new URL() bug
为什么使用 import.meta.url 和 new URL() 动态路径解析: 在 ESM(ECMAScript Modules)环境中,import.meta.url 提供了当前模块的完整 URL。结合 new URL(),你可以基于这个 URL 动态解析其他资源的路径。这样可以确保路…...
pico+unity3d开启彩色透视
1、点击游戏对象、点击XR、点击添加XR Origin,并把自带的摄像对象删除 2、添加脚本 using System.Collections; using System.Collections.Generic; using UnityEngine; using Unity.XR.PXR;//引入xr对象 public class toushi : MonoBehaviour {// Start is called…...
python常用命令
文章目录 1. 安装模块 1. 安装模块 pip install requests -i https://pypi.tuna.tsinghua.edu.cn/simple (切换数据源)...
使用定时器消除抖动
问题:定时器中断和按键中断属于什么操作模式,轮询吗? 具体怎么实现 定时器中断 (判断) 时间参数 按键中断(修改) 中断 向量表.s文件 DCD SysTick_Handler …...
IOS热门面试题一
GCD(Grand Central Dispatch)是什么?如何在iOS中使用它? GCD(Grand Central Dispatch)是什么? GCD(Grand Central Dispatch)是苹果公司开发的一套多线程编程的API&…...
构建LangChain应用程序的示例代码:62、如何使用Oracle AI向量搜索和Langchain构建端到端的RAG(检索增强生成)pipeline
Oracle AI 向量搜索与文档处理 Oracle AI向量搜索专为人工智能(AI)工作负载设计,允许您基于语义而非关键词来查询数据。 Oracle AI向量搜索的最大优势之一是可以在单一系统中结合对非结构化数据的语义搜索和对业务数据的关系搜索。 这不仅功能强大,而且…...
ffmpeg转换MP4为gif命令
这里记录一下使用 ffmpeg去转化 gif 的一些快捷命令 # 直接转换 ffmpeg -i 222.mp4 -r 12 222.gif# 调色板优化处理 ffmpeg -i 222.mp4 -r 12 -vf "split[s0][s1];[s0]palettegen[p];[s1][p]paletteuse" 222.gif第二条命令的解释如下: split[s0][s1]&am…...
kotlin Flow 学习指南 (三)最终篇
目录 前言Flow生命周期StateFlow 替代LiveDataSharedFlow其他常见应用场景处理复杂、耗时逻辑存在依赖关系的接口请求组合多个接口的数据 Flow使用注意事项总结 前言 前面两篇文章,介绍了Flow是什么,如何使用,以及相关的操作符进阶ÿ…...
Memcached负载均衡:揭秘高效缓存分发策略
标题:Memcached负载均衡:揭秘高效缓存分发策略 在分布式缓存系统中,Memcached通过负载均衡技术来提高缓存效率和系统吞吐量。负载均衡确保了缓存请求能够均匀地分配到多个缓存节点上,从而防止任何一个节点过载。本文将深入探讨Me…...
【Python实战因果推断】31_双重差分2
目录 Canonical Difference-in-Differences Diff-in-Diff with Outcome Growth Canonical Difference-in-Differences 差分法的基本思想是,通过使用受治疗单位的基线,但应用对照单位的结果(增长)演变,来估算缺失的潜…...
ArcGIS中使用线快速构造成面的方法
准备工作:一个需要转化为面的封闭线;一个处于可编辑状态的面要素文件。 1.选中一个围合封闭成的线 2.点击高级编辑工具中的构造面小工具 3.弹出对话框,直接点确定即可 4.效果如下图: 特别注意:记得要把面图层编辑功能…...
Spring AOP的几种实现方式
1.通过注解实现 1.1导入依赖 <dependency><groupId>org.springframework</groupId><artifactId>spring-aop</artifactId><version>5.1.6.RELEASE</version></dependency> 1.2定义注解 import java.lang.annotation.*;Targ…...
字节码编程bytebuddy之实现抽象类并并添加自定义注解
写在前面 本文看下使用bytebuddy如何实现抽象类,并在子类中添加自定义注解。 1:代码 1.1:准备基础代码 类和方法注解 package com.dahuyou.bytebuddy.cc.mine;import java.lang.annotation.ElementType; import java.lang.annotation.Re…...
LLM-阿里云 DashVector + ModelScope 多模态向量化实时文本搜图实战总结
文章目录 前言步骤图片数据Embedding入库文本检索 完整代码 前言 本文使用阿里云的向量检索服务(DashVector),结合 ONE-PEACE多模态模型,构建实时的“文本搜图片”的多模态检索能力。整体流程如下: 多模态数据Embedd…...
CentOS7安装部署git和gitlab
安装Git 在Linux系统中是需要编译源码的,首先下载所需要的依赖: yum install -y curl-devel expat-devel gettext-devel openssl-devel zlib-devel gcc perl-ExtUtils-MakeMaker方法一 下载: wget https://mirrors.edge.kernel.org/pub/s…...
《昇思25天学习打卡营第16天|基于MindNLP+MusicGen生成自己的个性化音乐》
MindNLP 原理 MindNLP 是一个自然语言处理(NLP)框架,用于处理和分析文本数据。 文本预处理:包括去除噪声、分词、词性标注、命名实体识别等步骤,使文本数据格式化并准备好进行进一步分析。 特征提取:将文…...
算法学习day10(贪心算法)
贪心算法:由局部最优->全局最优 贪心算法一般分为如下四步: 将问题分解为若干个子问题找出适合的贪心策略求解每一个子问题的最优解将局部最优解堆叠成全局最优解 一、摆动序列(理解难) 连续数字之间的差有正负的交替&…...
卡尔曼滤波Kalman Filter零基础入门到实践(上部)
参考视频:入门(秒懂滤波概要)_哔哩哔哩_bilibili 一、入门 1.引入 假设超声波距离传感器每1ms给单片机发数据。 理论数据为黑点, 测量数据曲线为红线,引入滤波后的数据为紫线 引入滤波的作用是过滤数据中的噪声&a…...
力扣-dfs
何为深度优先搜索算法? 深度优先搜索算法,即DFS。就是找一个点,往下搜索,搜索到尽头再折回,走下一个路口。 695.岛屿的最大面积 695. 岛屿的最大面积 题目 给你一个大小为 m x n 的二进制矩阵 grid 。 岛屿 是由一些相…...
调用支付宝接口响应40004 SYSTEM_ERROR问题排查
在对接支付宝API的时候,遇到了一些问题,记录一下排查过程。 Body:{"datadigital_fincloud_generalsaas_face_certify_initialize_response":{"msg":"Business Failed","code":"40004","sub_msg…...
macOS多出来了:Google云端硬盘、YouTube、表格、幻灯片、Gmail、Google文档等应用
文章目录 问题现象问题原因解决办法 问题现象 macOS启动台(Launchpad)多出来了:Google云端硬盘、YouTube、表格、幻灯片、Gmail、Google文档等应用。 问题原因 很明显,都是Google家的办公全家桶。这些应用并不是通过独立安装的…...
剑指offer20_链表中环的入口节点
链表中环的入口节点 给定一个链表,若其中包含环,则输出环的入口节点。 若其中不包含环,则输出null。 数据范围 节点 val 值取值范围 [ 1 , 1000 ] [1,1000] [1,1000]。 节点 val 值各不相同。 链表长度 [ 0 , 500 ] [0,500] [0,500]。 …...
《通信之道——从微积分到 5G》读书总结
第1章 绪 论 1.1 这是一本什么样的书 通信技术,说到底就是数学。 那些最基础、最本质的部分。 1.2 什么是通信 通信 发送方 接收方 承载信息的信号 解调出其中承载的信息 信息在发送方那里被加工成信号(调制) 把信息从信号中抽取出来&am…...
srs linux
下载编译运行 git clone https:///ossrs/srs.git ./configure --h265on make 编译完成后即可启动SRS # 启动 ./objs/srs -c conf/srs.conf # 查看日志 tail -n 30 -f ./objs/srs.log 开放端口 默认RTMP接收推流端口是1935,SRS管理页面端口是8080,可…...
VTK如何让部分单位不可见
最近遇到一个需求,需要让一个vtkDataSet中的部分单元不可见,查阅了一些资料大概有以下几种方式 1.通过颜色映射表来进行,是最正规的做法 vtkNew<vtkLookupTable> lut; //值为0不显示,主要是最后一个参数,透明度…...
【OSG学习笔记】Day 16: 骨骼动画与蒙皮(osgAnimation)
骨骼动画基础 骨骼动画是 3D 计算机图形中常用的技术,它通过以下两个主要组件实现角色动画。 骨骼系统 (Skeleton):由层级结构的骨头组成,类似于人体骨骼蒙皮 (Mesh Skinning):将模型网格顶点绑定到骨骼上,使骨骼移动…...
人机融合智能 | “人智交互”跨学科新领域
本文系统地提出基于“以人为中心AI(HCAI)”理念的人-人工智能交互(人智交互)这一跨学科新领域及框架,定义人智交互领域的理念、基本理论和关键问题、方法、开发流程和参与团队等,阐述提出人智交互新领域的意义。然后,提出人智交互研究的三种新范式取向以及它们的意义。最后,总结…...
解读《网络安全法》最新修订,把握网络安全新趋势
《网络安全法》自2017年施行以来,在维护网络空间安全方面发挥了重要作用。但随着网络环境的日益复杂,网络攻击、数据泄露等事件频发,现行法律已难以完全适应新的风险挑战。 2025年3月28日,国家网信办会同相关部门起草了《网络安全…...
windows系统MySQL安装文档
概览:本文讨论了MySQL的安装、使用过程中涉及的解压、配置、初始化、注册服务、启动、修改密码、登录、退出以及卸载等相关内容,为学习者提供全面的操作指导。关键要点包括: 解压 :下载完成后解压压缩包,得到MySQL 8.…...
