安卓文件上传照片单张及多张照片上传实现

一、首先导入对应库

//网络请求库
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);}});}

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/44845.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

算法day03 桶排序 数据结构分类 时间复杂度 异或运算

学数据结构之前 必看_哔哩哔哩_bilibili 1.认识复杂度和简单排序算法_哔哩哔哩_bilibili 桶排序&#xff08;Bucket sort&#xff09;------时间复杂度为O(n)的排序方法&#xff08;一&#xff09;_多桶排序时间复杂度-CSDN博客 桶排序 测试场景&#xff1a;数组中有10000个随…

threeJS 为模型增加精灵图

前言 之前使用css3DRender创建图片弹框&#xff0c;在旋转模型到背面时&#xff0c;弹框也背对模型&#xff0c;这与UI要求的效果有出入。考虑将css3DRender换成css2Drender,但是可能是模型的问题&#xff0c;将弹框加入到模型的子集&#xff0c;旋转模型时弹框发生比较明显的…

deep learning 环境配置

1 NVIDIA驱动安装 ref link: https://blog.csdn.net/weixin_37926734/article/details/123033286 2 cuda安装 ref link: https://blog.csdn.net/qq_63379469/article/details/123319269 进去网站 https://developer.nvidia.com/cuda-toolkit-archive 选择想要安装的cuda版…

研华PCI-1711板卡在WIN10教育版系统无法安装驱动

主要配置&#xff1a;CHIPSET AIMB-705G2、CPU I5-6500、WIN10 教育版、PCI-1711 问题描述&#xff1a;使用官网下载的驱动XNiva&#xff0c;驱动包安装完成后板卡无法正常识别。解决方法&#xff1a;正常安装无法情况下只能尝试强制安装数字签名&#xff0c;步骤如下。 XNiv…

Gunicorn:Python Web应用的高效生产服务器

引言 在现代Web开发中&#xff0c;部署Python Web应用通常需要一个既高效又可靠的服务器。Gunicorn&#xff08;Green Unicorn&#xff09;是一个Python WSGI HTTP服务器&#xff0c;它简单、快速且易于使用&#xff0c;非常适合生产环境。本文将介绍Gunicorn的基本概念、安装…

Springboot redisson 自定义注解实现双写一致性

在 Spring Boot 项目中使用 Redisson 实现双写一致性&#xff08;即数据库和缓存的一致性&#xff09;&#xff0c;可以通过自定义注解和 AOP&#xff08;面向切面编程&#xff09;来简化代码并提高可维护性。以下是一个具体的案例&#xff0c;展示了如何使用自定义注解和 AOP …

Java研学-Shiro安全框架(四)

六 SpringBoot集成Shiro认证 1 分析 Shiro提供认证授权功能&#xff0c;所以SpringBoot中不需再编写自定义注解&#xff0c;权限拦截&#xff0c;登录拦截&#xff0c;登录登出。Shiro 环境中有三个封装对象Subject &#xff0c;SecurityManager和Realms&#xff0c;SpringBoo…

Java核心技术【二十一】Java的I/O流处理:文件的读写操作

Java的I/O流处理&#xff1a;文件读写操作 【创作】 不易&#xff0c;【点赞】 是情义&#xff0c;【关注】 是动力&#xff0c;【收藏】 是回忆。 示例代码地址&#xff1a;https://gitee.com/code-in-java/csdn-blog.git 在Java编程中&#xff0c;输入/输出&#xff08;I/O&a…

PyTorch实现BERT预训练模型转化指南

huggingface官方的介绍&#xff1a; https://huggingface.co/transformers/converting_tensorflow_models.html 直接用命令行 把箭头处路径改为自己放原有tf版本预训练模型的路径 回车后会有一大堆提示&#xff0c;然后发现路径下多了一个bin文件&#xff0c;加上原本的config…

顺序结构 ( 六 ) —— 顺序结构实例 【互三互三】

&#x1f680;欢迎互三&#x1f449;&#xff1a;程序猿方梓燚 &#x1f48e;&#x1f48e;&#x1f680;所属专栏&#xff1a;C教程&#x1f48e; &#x1f680;关注博主&#xff0c;后期持续更新系列文章 &#x1f680;如果有错误感谢请大家批评指出&#xff0c;及时修改 &am…

iNavFlight飞控固件学习-1《开发环境搭建》

目录 文章目录 目录摘要1.官网2.形成Linux开发环境工具2.1 简介2.2 相关工具2.2.1 Ubuntu / Debian系统配置命令2.2.2 Fedora系统配置命令2.2.3 Fedora系统配置命令 2.3 克隆存储库2.4 构建工具2.5 使用cmake2.6 构建固件2.7 清除2.8 cmake 缓存维护2.9 编译通过ninja2.10 更新…

js 日期比较大小

在JavaScript中&#xff0c;比较日期大小通常涉及将日期转换为时间戳&#xff08;自1970年1月1日以来的毫秒数&#xff09;&#xff0c;然后比较这些时间戳。这是因为直接比较两个Date对象可能不会按预期工作&#xff0c;特别是如果你试图了解哪个日期在另一个日期之前或之后。…

红酒与未来科技:传统与创新的碰撞

在岁月的长河中&#xff0c;红酒以其深邃的色泽、丰富的口感和不同的文化魅力&#xff0c;成为人类文明中的一颗璀璨明珠。而未来科技&#xff0c;则以其迅猛的发展速度和无限的可能性&#xff0c;领着人类走向一个崭新的时代。当红酒与未来科技相遇&#xff0c;一场传统与创新…

2024.07.03校招 实习 内推 面经

绿*泡*泡VX&#xff1a; neituijunsir 交流*裙 &#xff0c;内推/实习/校招汇总表格 1、提前批 | 中国兵器工业集团第二〇二研究所 | 提前批/招/聘暨/暑期/开放日 提前批 | 中国兵器工业集团第二〇二研究所 | 提前批招聘暨暑期开放日 2、夏令营 | 2024年南网数字集团“未来…

ADI新型充电器解决方案可实现电池堆电压和充电效率

就目前而言&#xff0c;这可能是生活中zui常见的问题了。世纪之交&#xff0c;电池&#xff08;尤其是基于锂离子的电池&#xff09;成本的降低和性能的提高&#xff0c;推动了电池供电的储能和便携式设备的稳步增长。此外&#xff0c;超级电容器由于具有独特的性质&#xff0c…

oppo25届秋招,快手25届技术人才专项计划内推

oppo25届秋招&#xff0c;快手25届技术人才专项计划内推 ①【OPPO】25届秋招开启&#xff01; 内推简历优先筛选&#xff01; &#x1f449;岗位类别&#xff1a;AI/算法类&#xff0c;软件类&#xff0c;硬件类&#xff0c;工程技术类&#xff0c;品牌策划类&#xff0c;设计类…

骨传导耳机最热门好用款推荐,选购骨传导耳机前不能忽略的六大细节

如今的社会在耳机种类方面可以说是越来越多&#xff0c;于是很多人在挑选的时候往往选择不到适合自己的一款耳机&#xff0c;尤其是在近些年来席卷耳机市场的骨传导耳机&#xff0c;开放耳道的设计在很多时候佩戴无异于是更加的适合&#xff0c;正好小编这边对于比较热门的几款…

社交App iOS审核中的4.3问题:深入分析与解决策略

社交App审核中的4.3问题&#xff1a;深入分析与解决策略 在iOS应用开发和审核过程中&#xff0c;开发者经常会遇到苹果审核4.3问题。这一问题往往涉及应用的设计和内容重复性&#xff0c;导致应用被拒绝上架。为了帮助开发者更好地理解和解决这一问题&#xff0c;本文将对4.3问…

动漫3d模型设计需要注意什么?---模大狮模型网

设计动漫3D模型时&#xff0c;有几个方面需要注意&#xff1a; 保持角色风格一致性&#xff1a; 动漫通常有独特的风格和美学&#xff0c;设计时要确保模型与所代表的角色或作品的整体风格相符。注意保持线条和比例的一致性&#xff0c;使模型能够忠实地呈现原作的特点。 注重…

springboot餐饮管理系统-计算机毕业设计源码43667

摘 要 在信息化、数字化的时代背景下&#xff0c;餐饮行业面临着前所未有的挑战与机遇。为了提高运营效率、优化顾客体验&#xff0c;餐饮企业亟需一套高效、稳定且灵活的管理系统来支撑其日常运营。基于Spring Boot的餐饮管理系统应运而生&#xff0c;成为餐饮行业数字化转型的…