Andoid - 开发实例(5):上传文件实现方法

ERROR: Ignored the following yanked versions: 0.8.3, 0.10.19.dev18 的解决办法 关于这个问题,博主是在进行项目中的python依赖包安装的时候遇见的,遇到的异常:关于这个问题,是在。 阅读详情
一月份做项目时 Android 客户端需要上传图片,小小的研究了下,不改独享,分享!

如果要在客户端向服务器上传文件,我们就必须模拟一个POST multipart/form-data类型的请求,Content-Type必须是multipart/form-data
这篇详细介绍这个 ENCTYPE="multipart/form-data" 协议,来解决自己的Java程序向服务器传文件的问题(比如:安卓程序上传图片)

ENCTYPE="multipart/form-data" :通过 http 协议上传文件 rfc1867协议,客户端发送内容构造。

<form action="picture/upload.do" method="POST" ENCTYPE="multipart/form-data">
    <input type="text" name="users_id">
    <input type="text" name="users_name">
    <input type="file" name="image_path">
    <input type="submit">
</form>
使用上面这个表单,抓包的结果如下
POST /picture/upload.do HTTP/1.1
Accept: application/x-ms-application, image/jpeg, application/xaml+xml, image/gif, image/pjpeg, application/x-ms-xbap, */*
Referer: http://192.168.1.98:8080/uploadpic.jsp
Accept-Language: zh-CN
User-Agent: Mozilla/4.0 
Content-Type: multipart/form-data; boundary=---------------------------7dd36df20300
Accept-Encoding: gzip, deflate
Host: 192.168.1.98:8080
Content-Length: 529762
Connection: Keep-Alive
Cache-Control: no-cache

-----------------------------7dd36df20300
Content-Disposition: form-data; name="users_id"
<!--空行-->
1
-----------------------------7dd36df20300
Content-Disposition: form-data; name="users_name"
<!--空行-->
admin
-----------------------------7dd36df20300
Content-Disposition: form-data; name="image_path"; filename="S21223-170317.jpg"
Content-Type: image/pjpeg
<!--空行-->
<!--文件 byte 数据-->
-----------------------------7dd36df20300--
<!--空行-->

详细解析:
Content-Type: multipart/form-data; boundary=---------------------------7dd36df20300
根据 rfc1867, multipart/form-data是必须的。
---------------------------7dd36df20300  是分隔符,分隔多个文件、表单项。
其中 d36df20300 是即时生成的一个字符,用以确保整个分隔符不会在文件或表单项的内容中出现。
---------------------------7d    IE内核标志
---------------------------71    Mozila内核标志
从请求体里可以看出每一条数据后面都有换行 \r\n ,并且 Parameter 和 value 之间还有个空行
最后把格式提取:
--分隔符 \r\n
Content-Disposition: form-data; name="[Parameter]" \r\n
\r\n
[value] \r\n
--分隔符 \r\n
Content-Disposition: form-data; name="[Parameter]"; filename="[]" \r\n
Content-Type: image/pjpeg \r\n
\r\n
<!--文件 byte 数据--> \r\n
--分隔符-- \r\n
\r\n

了解了传输格式,接下来就是程序实现:

String path = "http://192.168.1.102:8080/picture/upload.do";
// 换行符
String enter = "\r\n";
// 分割线
String boundary = "---------------------------7dd36df20300";
StringBuffer sb = new StringBuffer();
// 获取文件流
File file = new File("D:\\123.jpg");
FileInputStream is = new FileInputStream(file);
// 参数信息
String[] keys = { "users_id", "users_name" };
String[] values = { "1", "admin" };
// 拼凑参数
for (int i = 0; i < keys.length; i++) {
    sb.append("--" + boundary + enter);
    sb.append("Content-Disposition: form-data; name=\"" + keys[i] + "\"");
    sb.append(enter + enter);
    sb.append(values[i]);
    sb.append(enter);
}
// 拼凑文件头部信息
sb.append("--" + boundary);
sb.append(enter);
sb.append("Content-Disposition: form-data; name=\"image_path\"; filename=\"123.jpg\"");
sb.append(enter);
sb.append("Content-Type: image/*");
sb.append(enter + enter);
byte[] data = sb.toString().getBytes();
byte[] end_data = (enter + "--" + boundary + "--" + enter + enter).getBytes();
// 初始化 HttpURLConnection
URL url = new URL(path);
HttpURLConnection con = (HttpURLConnection) url.openConnection();
con.setConnectTimeout(3000);
con.setDoInput(true);
con.setDoOutput(true);
con.setUseCaches(false);
con.setRequestMethod("POST");
con.setRequestProperty("Connection", "Keep-Alive");
con.setRequestProperty("Charset", "UTF-8");
con.setRequestProperty("Content-Type", "multipart/form-data;boundary=" + boundary);
con.setRequestProperty("Content-Length", file.length() + data.length 
+ end_data.length + "");
// 开始上传
OutputStream outputStream = con.getOutputStream();
outputStream.write(data);
byte[] fileBuffer = new byte[1024];
int length = -1;
while ((length = is.read(fileBuffer)) != -1) {
    outputStream.write(fileBuffer, 0, length);
}
is.close();
outputStream.write(end_data);
outputStream.flush();
outputStream.close();
con.getResponseCode();



uni-app - 文本展开 / 收起折叠功能,支持自定义样式(当文本内容超出规定行数后,展开收起折叠的功能)兼容 H5 / App / 小程序且易用更容易修改的插件组件源码,超详细的示例代码及注释 uniapp实现文本的展开与收起功能,uniapp展开全部和收起,uniapp里文本的展开与收起,uniapp中文本内容超出规定行数后展开收起的处理,UNIAPP兼容h5、微信小程序多行文本展开或收起,uni-app中,文字超出隐藏并显示省略号(实现展开、收起全文),uni-app中文本过长-实现折叠与展开效果,中文本内容超出规定行数(字数)后展开收起的处理,超出部分...显示,uniapp适用于uniapp多行文本溢出显示...,多行文本展开或收起,uni-app-文本展开/收起折叠功能,支 阅读详情

相关推荐

AD域控设置客户端桌面壁纸

此时再右键wallpaper文件夹,共享选项下的网络路径已经有了。找到该域下的组策略编辑器(第一步有)并按照图下所示找到桌面壁纸的策略设置,点击进去。在高级共享里可以设置共享名和同时共享的用户数量限制。点击下拉箭头,找到Everyone并选择,点击添加后,点击共享。然后可以看到刚才的新建文件夹策略在域控服务器和客户端都生效了。右键wallpaper文件夹->属性,点击共享选项,点击共享。在弹出的窗口里,按照图下所示设置,点击应用并且确认。在弹出的窗口里,按图示找到文件夹,右键新建文件夹。

欲买桂花同载酒的博客 6054

Jenkins+Unity+Mac+Ipa&Apk 总结

根据项目初级的需求,整理一键化这个功能。美中不足的是,因为游戏用的是tolua框架,而最新的mac机器不是luajit ,是原生lua。所以mac用打了字节码的bundle是解析不了的。 但是mac可以打非lua字节码的bundle。 所以AB文件必须在win平台下打好,提交才可以在打包。也就是没有实现真正的一键化打包。。。。。。。 如果有2台打包机,一个window打AB,一个Mac打...

xj1009420846的博客 1157

Angular 相关的知识点和项目汇总

Angular 知识点和项目汇总

weixin_45428910的博客 578

基于Android的 拍照上传 程序开发

大家好,我是PETER(cfwdl)。写这篇文章是为了帮助以前没有没有接触过anroid或是刚刚入门并没有摸过手机的硬件设备监测、使用等功能的朋友,给大家一个我自己的写的心得和经验,我也是新手,所以大家互相交换一下经验吧。当然每个程序都会有问题,因为我不是最终用户,软件的测试工作没有好好测试过,大家凑合看看吧~!程序介绍:本程序主要完成一个煎蛋的android手机拍照程序(本程序的拍照功能比较简单,没有添加处理图像、手机自动对焦等功能,如果有需要的朋友可以自行参考一下相关linstener或action的资

PETER的专栏 3万+

Codesys软运动控制进阶:用SMC_FreeEncoder为ECAT轴搭建一个“虚拟手轮”调试工具

本文详细介绍了如何利用Codesys的SMC_FreeEncoder功能为ECAT轴搭建虚拟手轮调试工具,解决自动化设备开发中的硬件依赖问题。通过软件模拟手轮脉冲信号,实现无硬件依赖的运动控制逻辑验证,显著提升调试效率。适用于汇川AM400等PLC平台,特别适合机械安装滞后或伺服驱动器故障时的调试场景。

weixin_33737774的博客 478

ACR 磁共振安全手册 2024 更新版:全面保障 MRI 安全实践

MR 环境:MR 系统周围的三维空间,包含法拉第屏蔽体积和 9 高斯线,医疗设备在此区域可能因暴露于 MR 设备产生的电磁场而构成危险,需进行访问控制以降低风险MR 受控访问区域:MR 系统周围的局部定义区域,包含 MR 环境(包括其静磁场),访问仅限于授权人员MR 抛射物区域:围绕 MRI 系统的 IV 区区域,铁磁物体在此有成为抛射物的风险图一 磁共振环境:场地规划与区域划分。

楚山之石的博客 2601

android 文件、图片上传功能实现

方法一: 使用 afinal上传

小宾 1703

从零到一:如何用YOLOv8和PyQt5打造你的第一个花卉识别桌面应用

本文详细介绍了如何使用YOLOv8和PyQt5从零开始构建一个花卉识别桌面应用。涵盖环境搭建、数据准备、模型训练、界面设计、模型集成与性能优化等全流程,帮助开发者快速掌握深度学习目标识别技术的实际应用。

weixin_29048775的博客 454

日常水文章之安卓文件上传(okhttpclien)

不废话直接先导包: 这里我是用的jar包,你们可以网上直接找最新的,也可以找跟我版本差不多的 fun Upload(uploadFilePath: String?, Uri: String?, mMediaType: String?, mResponseCallback: ResponseCallback) { Log.i("TAG", "uploadFilePath:" + u.

沐的博客 6962

iOS逆向实战:绕过SSL Pinning抓取ChatGPT设备令牌

在移动应用安全与网络协议分析领域,中间人攻击是一种核心的流量拦截与分析技术。其原理是在客户端与服务器之间插入一个代理节点,通过伪造数字证书来解密和窥探HTTPS加密流量。这项技术的工程价值在于,它使开发者能够调试API、分析通信协议以及实现自动化集成。然而,许多高安全要求的应用(如金融、社交类App)会采用SSL Pinning(证书绑定)技术来抵御此类攻击,这为逆向工程带来了挑战。本文聚焦于一个具体的应用场景:如何针对启用了SSL Pinning的ChatGPT iOS客户端,通过特定的工具链(如Trol

weixin_28235889的博客 976

Lasso的原理及其与其他特征选择方法的比较进行阐述,然后讨论Lasso优点、缺点以及应用场景,最后给出了代码实例

在机器学习领域中,特征选择(feature selection)是指在模型训练前对数据集进行分析,选择其中有助于预测目标变量或影响模型性能的特征,去除不相关或冗余的特征,提升模型的泛化能力。而Lasso回归是一种很流行的用于特征选择的方法之一。Lasso回归(又称LASSO,least absolute shrinkage and selection operator)是一种线性模型中的特征选择方法。

AI天才研究院 3051

Android获取文本和文件的MD5密纹和SHA1密纹

最近在做图片上传的应用,出于对文件上传的完整性和安全性的校验,我们使用了较为简单的MD5校验。今天我们就来简单的说一下在Android平台下如何使用官方提供的API获取文件以及文本的MD5密纹用于校验。本篇主要会介绍两种方式,一种是MD5,一种是SHA-1;至于原因可以参见下面我从API文档截取的图片: 关于MD5和SHA的理论介绍,网上也有很多介绍,这里不再累述,具体可以参...

hfut_why的博客 1201

1、语义数据建模:避免陷阱与突破困境

本文探讨了语义数据建模的兴起背景、核心概念、生命周期及常见挑战。从数据丰富型组织和AI开发者的需求出发,分析了语义建模的关键元素和质量维度,并深入讨论了建模过程中可能出现的陷阱与解决方案。文章还针对语义模型的演化、治理和战略组织问题提供了突破思路,旨在帮助数据从业者更好地理解和应用语义建模技术,以提升数据驱动应用的有效性。

c8d9e0f1的博客 119

Android HTTP multipart/form-data 请求协议信息实现图片上传

问题: Android应用中,当遇到填写用户信息、发表评论等操作,不可避免会遇到“form表单操作”(类似web form操作)上传图片的功能。 在这种情况下,使用Android的HTTPConnection/ ApacheHTTP 通过POST 和GET的方式就实现不了。 解决方法: Android客户端通过模拟 HTTP multipart/form-data 请求协议信息实现图片

zcmain的专栏 4603

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

Android上传图片到服务器

上一篇博客介绍了Android压缩图片 这篇博客介绍把压缩后的图片上传到服务器。 由于我只熟悉JAVA编程,这里的服务器端也是采用JAVA编写的,这里首先介绍介绍基于JAX-WS API的Webservice接收图片,然后介绍Http post接收图片。 开发环境:MyEclipse 10 Tomcat 7 Java Webservice 接收手机端上传图片 打开MyEclips

专注Android开发 1368

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

Pro Android学习笔记(六九):HTTP服务(3):HTTP POST MultiPart

HTTP POST不仅可以通过键值对传递参数,还可以携带更为复杂的参数,例如文件。HTTP Post支持携带body,content-type为multipart。本次我们将尝试通过http post上传一个小文件。 建立测试环境 上传文件的测试环境很难找,下载了Tomcat,想装一个环境,打开后,发现忘得也差不多,要看帮助,比较麻烦,下面是我上传文件到189网盘抓的包,上传一个图片文件,整个

愷风(Wei)的专栏 6502

Android 实现能够暂停的录音功能

转载请注明出处:http://blog.youkuaiyun.com/yegongheng/article/details/40624267       我们知道Android ApI提供了MediaRecorder和AudioRecord两个类给开发者来很方便地实现音视频的录制(前者可以实现音频和视频的录制,后者只能实现音频的录制)。这两个类都提供了start()和stop()方法用于

Android起跑线 1047

如何写一个混淆配置文件

一、混淆apk的必要性 当我们的app开发完毕上传各大应用市场的时候如果我们不进行apk的混淆就会导致app的安全性大大的降低,你也不想自己幸幸苦苦做完的项目就这么轻易的被别人窃取了。混淆虽然不能完全防止别人反编译apk看到你的代码,也能很大程度上让反编译的代码阅读性降低。所以混淆还是必须的。二、如何混淆 在Android Studio当中混淆APK实在是太简单了,,只需要修改b

七夜聖君的博客 1658

PHP8.3+SQLite3轻量网盘部署实战:环境配置与性能优化指南

SQLite作为轻量级嵌入式数据库,以其零配置、单文件存储的特性在小型Web应用中广受欢迎。其基于文件锁的并发控制机制虽然简单高效,但在高并发写入场景下可能存在性能瓶颈。从技术价值看,SQLite极大降低了数据库部署复杂度,特别适合个人项目、原型开发和资源受限环境。在文件分享网盘、博客系统、移动应用等场景中,SQLite能有效支撑基础数据存储需求。本文以尘集外链网盘为例,详细解析PHP8.3环境下SQLite3的兼容性配置、文件上传优化策略,并针对数据库锁和并发写入等常见问题提供解决方案,帮助开发者快速构建

weixin_33778544的博客 393

AndroidStudio通过intent播放sdcard中的音乐时闪退问题

一、代码 在布局文件中添加一个button,在主类中为button设置监听事件,通过intent来播放音乐 1.编写activity_main.xml <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_

qq_52491380的博客 1568

Android 动画各种实现,包括帧动画、补间动画和属性动画的总结分享

AndroidAnimationExercise 项目地址:REBOOTERS/AndroidAnimationExercise 简介: Android 动画各种实现,包括帧动画、补间动画和属性动画的总结分享 更多:作者提 Bug 标签: 转存失败重新上传取消 这是一个关于 Android 中各种 View 的集合,里面包含自己日常开发和博客总结中的代码。 主要内容...

未来很长,但我会努力的走下去。 768

海外SDK之----------谷歌支付

哈喽,么么哒!我们继续上次说好的谷歌支付。 同国内sdk一样,支付必须得有商品ID才行,谷歌也一样,如果你是个人开发者,你得需要在 https://play.google.com/apps/publish/signup 这个网址花费25美金申请一个账户, 然后在后台创建你的应用,然后就是申请你支付信息,由于我也没有具体去申请过,所以我在这里转载一个网址 http://www.cnb...

大嫂的博客 3070

android经典蓝牙开发

Android蓝牙开发

limeng的博客 1079

Android 之实现类似QQ图片说说照片选择

Android 之实现类似QQ图片说说照片选择转载请注明出处:http://blog.youkuaiyun.com/klxh2009/ 本文出自【付小华的博客】 效果展示 布局文件 代码实现 效果展示 布局文件 布局是很简单的,一个GridView,直接上布局: layout/activity_add_photo.xml<?xml version="1.0" encoding="utf-8"?> <Lin

付小华的博客 6681

小白如何使用Android Studio把自己的Android library分享到jCenter

本文的目的是帮助的小伙伴把自己的Android Studio里面的Android library分享到jCenter,从而更好的使用

tingxuege 619

易接SDK接入:Android手游支付功能接口实现,完整代码奉上

  之前在一家游戏公司写过游戏服务端,游戏支付功能,这个是接入“易接”平台的SDK实现的, 由于涉及的坑比较多,所以总结一下经验,以及奉上完整代码。   首先我们的项目是以Cocos2dx引擎的手游,这个用visual Studio编写代码, 这个项目是LUA工程,但是里面有多个平台的代码,但是我们现在只写Android这一块 它可以实现跨平台:Android,IOS,blackberry,...

哲学天空的博客 3680

Android开发人员不得不收集的代码(不断更新)

为方便查找,已进行大致归类,其目录如下所示: 尺寸相关→SizeUtils.java dp与px转换 dp2px、px2dp sp与px转换 sp2px、px2sp 各种单位转换 applyDimension 在onCreate()即可强行获取View的尺寸 forceGetViewSize Lis

Java和Android架构 1304
上一篇: Java.Web - JSP文件上传,Servlet接收文件
下一篇: Java.WebService - Webservice初体验之调用学院客户端开放接口
刘云龙在搞机
博客等级 码龄14年 57粉丝 46原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值