安卓文件上传照片单张及多张照片上传实现
一、首先导入对应库
//网络请求库
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 。 岛屿 是由一些相…...
F3工具深度解析:开源存储设备容量检测与反欺诈技术
F3工具深度解析:开源存储设备容量检测与反欺诈技术 【免费下载链接】f3 F3 - Fight Flash Fraud 项目地址: https://gitcode.com/gh_mirrors/f3/f3 F3(Fight Flash Fraud)是一个专业的开源存储设备容量检测工具,通过伪随机…...
免费德州扑克GTO求解器终极指南:如何用Desktop Postflop提升你的扑克技术
免费德州扑克GTO求解器终极指南:如何用Desktop Postflop提升你的扑克技术 【免费下载链接】desktop-postflop [Development suspended] Advanced open-source Texas Holdem GTO solver with optimized performance 项目地址: https://gitcode.com/gh_mirrors/de/d…...
CANN-昇腾NPU梯度累积-显存不够时怎么模拟大batch训练
大模型训练的最佳 batch size 通常在 1M-4M tokens。8 卡 Atlas 800I A2 的总显存 512GB,batch size 能开到 50 万 tokens 左右——不够。梯度累积让你用小 batch 跑多次前向,累积梯度后一次性更新,等效于大 batch 训练。 梯度累积的原理 标准…...
Desktop Postflop终极指南:免费开源德州扑克GTO求解器完整教程
Desktop Postflop终极指南:免费开源德州扑克GTO求解器完整教程 【免费下载链接】desktop-postflop [Development suspended] Advanced open-source Texas Holdem GTO solver with optimized performance 项目地址: https://gitcode.com/gh_mirrors/de/desktop-pos…...
安卓HTTPS抓包证书信任问题深度解析与系统级迁移方案
1. 为什么安卓抓包总在“证书信任”这关卡住?——一个被低估的系统级权限问题你是不是也经历过:Fiddler、Charles 或 mitmproxy 在电脑上配置得严丝合缝,手机 Wi-Fi 代理一设就通,HTTP 流量哗哗跑,可一到 HTTPS&#x…...
从手机拍照到视频播放:一文看懂YUV(NV12/YUV444)格式为什么无处不在
从手机拍照到视频播放:YUV格式的技术演进与行业实践 当你用手机拍摄一张照片或录制一段视频时,图像数据在传感器采集后经历了一系列复杂的格式转换过程。这些转换不仅关乎图像质量,更直接影响着存储空间、处理速度和传输效率。在众多色彩编码…...
REFramework终极指南:如何构建企业级RE引擎游戏Mod开发框架
REFramework终极指南:如何构建企业级RE引擎游戏Mod开发框架 【免费下载链接】REFramework Mod loader, scripting platform, and VR support for all RE Engine games 项目地址: https://gitcode.com/GitHub_Trending/re/REFramework REFramework是一个专为R…...
暗黑破坏神2终极宽屏体验:D2DX完全配置指南
暗黑破坏神2终极宽屏体验:D2DX完全配置指南 【免费下载链接】d2dx D2DX is a complete solution to make Diablo II run well on modern PCs, with high fps and better resolutions. 项目地址: https://gitcode.com/gh_mirrors/d2/d2dx 还在为经典暗黑破坏神…...
别再只用默认样式了!手把手教你定制LVGL Bar进度条的3种高级视觉效果
突破视觉边界:LVGL进度条高级定制技法三则 在嵌入式UI开发领域,LVGL以其轻量级和高度可定制性赢得了众多开发者的青睐。但当我们超越基础功能实现,进入视觉表现力的深水区时,这个开源图形库的真正魅力才开始显现。进度条作为人机交…...
AI 大模型未来技术演进方向与应用发展趋势预判
引言:AI 技术快速迭代,未来已来AI 大模型技术正以超乎想象的速度迭代演进,从参数规模扩张到能力提升、从技术架构创新到应用场景拓展、从成本高企到普惠落地,每一次技术突破都在重塑产业格局、改变商业逻辑、影响生活方式。2026 年…...
