版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
【移动应用开发技术】Android中怎么利用OkHttp上传文件到服务器
Android中怎么利用OkHttp上传文件到服务器,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。一、编写服务器端在上一讲服务器下新建UploadFileServlet,代码如下:然后重启服务器!@WebServlet("/UploadFileServlet")
@MultipartConfig
public
class
UploadFileServlet
extends
HttpServlet
{
private
static
final
long
serialVersionUID
=
1L;
public
UploadFileServlet()
{
super();
//
TODO
Auto-generated
constructor
stub
}
/**
*
@see
HttpServlet#doGet(HttpServletRequest
request,
HttpServletResponse
*
response)
*/
protected
void
doGet(HttpServletRequest
request,
HttpServletResponse
response)
throws
ServletException,
IOException
{
this.doPost(request,
response);
}
/**
*
@see
HttpServlet#doPost(HttpServletRequest
request,
HttpServletResponse
*
response)
*/
protected
void
doPost(HttpServletRequest
request,
HttpServletResponse
response)
throws
ServletException,
IOException
{
System.out.println("doPost==");
request.setCharacterEncoding("utf-8");
//获取file命名的part,注意要与Android端一样
Part
part
=
request.getPart("file");
//
获取请求头,请求头的格式:form-data;
name="file";
filename="snmp4j--api.zip"
String
header
=
part.getHeader("content-disposition");
System.out.println(header);
String
fileName
=
getFileName(header);
//
存储路径
String
savePath
=
"D:/huang/upload";
//
把文件写到指定路径
part.write(savePath
+
File.separator
+
fileName);
response.setCharacterEncoding("UTF-8");
PrintWriter
writer
=
response.getWriter();
writer.print("上传成功");
}
public
String
getFileName(String
header)
{
/**
*
header
为
form-data;
name="file";
filename="dial.png"
*
String[]
tempArr1
=
*
header.split(";");代码执行完之后,在不同的浏览器下,tempArr1数组里面的内容稍有区别
*
火狐或者google浏览器下:tempArr1={form-data,name="file",filename=
*
"snmp4j--api.zip"}
*
IE浏览器下:tempArr1={form-data,name="file",filename="E:\snmp4j--api.zip"}
*/
String[]
tempArr1
=
header.split(";");
/**
*
火狐或者google浏览器下:tempArr2={filename,"snmp4j--api.zip"}
*
IE浏览器下:tempArr2={filename,"E:\snmp4j--api.zip"}
*/
String[]
tempArr2
=
tempArr1[2].split("=");
//
获取文件名,兼容各种浏览器的写法
String
fileName
=
tempArr2[1].substring(tempArr2[1].lastIndexOf("\\")
+
1).replaceAll("\"",
"");
return
fileName;
}
}二、Android端1.布局,上一讲activity_main代码中添加:
<Button
android:id="@+id/ok_post_file"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="上传文件"
/>
<TextView
android:id="@+id/post_text"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center"
android:text="0"
/>
<ProgressBar
android:id="@+id/post_progress"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:max="100"
/>2.OkHttpUtil新增上传文件方法:
public
static
void
postFile(String
url,
final
ProgressListener
listener,
Callback
callback,
File...files){
MultipartBody.Builder
builder
=
new
MultipartBody.Builder();
builder.setType(MultipartBody.FORM);
Log.i("huang","files[0].getName()=="+files[0].getName());
//第一个参数要与Servlet中的一致
builder.addFormDataPart("file",files[0].getName(),
RequestBody.create(MediaType.parse("application/octet-stream"),files[0]));
MultipartBody
multipartBody
=
builder.build();
Request
request
=
new
Request.Builder().url(url).post(new
ProgressRequestBody(multipartBody,listener)).build();
okHttpClient.newCall(request).enqueue(callback);
}3.ProgressRequestBody是自定义RequestBody类,用来监听进度:public
class
ProgressRequestBody
extends
RequestBody
{
public
static
final
int
UPDATE
=
0x01;
private
RequestBody
requestBody;
private
ProgressListener
mListener;
private
BufferedSink
bufferedSink;
private
MyHandler
myHandler;
public
ProgressRequestBody(RequestBody
body,
ProgressListener
listener)
{
requestBody
=
body;
mListener
=
listener;
if
(myHandler==null){
myHandler
=
new
MyHandler();
}
}
class
MyHandler
extends
Handler
{
//放在主线程中显示
public
MyHandler()
{
super(Looper.getMainLooper());
}
@Override
public
void
handleMessage(Message
msg)
{
switch
(msg.what){
case
UPDATE:
ProgressModel
progressModel
=
(ProgressModel)
msg.obj;
if
(mListener!=null)mListener.onProgress(progressModel.getCurrentBytes(),progressModel.getContentLength(),progressModel.isDone());
break;
}
}
}
@Override
public
MediaType
contentType()
{
return
requestBody.contentType();
}
@Override
public
long
contentLength()
throws
IOException
{
return
requestBody.contentLength();
}
@Override
public
void
writeTo(BufferedSink
sink)
throws
IOException
{
if
(bufferedSink==null){
bufferedSink
=
Okio.buffer(sink(sink));
}
//写入
requestBody.writeTo(bufferedSink);
//刷新
bufferedSink.flush();
}
private
Sink
sink(BufferedSink
sink)
{
return
new
ForwardingSink(sink)
{
long
bytesWritten
=
0L;
long
contentLength
=
0L;
@Override
public
void
write(Buffer
source,
long
byteCount)
throws
IOException
{
super.write(source,
byteCount);
if
(contentLength==0){
contentLength
=
contentLength();
}
bytesWritten
+=
byteCount;
//回调
Message
msg
=
Message.obtain();
msg.what
=
UPDATE;
msg.obj
=
new
ProgressModel(bytesWritten,contentLength,bytesWritten==contentLength);
myHandler.sendMessage(msg);
}
};
}
}4.在MainActivity添加上传按钮点击事件,代码如下:
File
file
=
new
File(basePath
+
"/1.mp4");
String
postUrl
=
"04:8080/OkHttpServer/UploadFileServlet";
OkHttpUtil.postFile(postUrl,
new
ProgressListener()
{
@Override
public
void
onProgress(long
currentBytes,
long
contentLength,
boolean
done)
{
Log.i(TAG,
"currentBytes=="
+
currentBytes
+
"==contentLength=="
+
conten
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2024年广东省深圳市中考英语押题试卷(二)
- 上海市市辖区(2024年-2025年小学五年级语文)统编版竞赛题((上下)学期)试卷及答案
- 上海市县(2024年-2025年小学五年级语文)统编版期末考试(下学期)试卷及答案
- 海南省陵水黎族自治县2022-2023学年四年级上学期期中英语试题
- 卫生监督机构公益目标评估指标调查表
- 【初中物理】光现象+单元练习-+2024-2025学年人教版物理八年级上册
- 河北省保定市定州市2024-2025学年高二上学期11月期中物理试题(无答案)
- 职业学院轮机工程技术专业人才培养方案
- 厨房用瓮非贵金属制市场需求与消费特点分析
- 戒烟用药物制剂市场需求与消费特点分析
- 251直线与圆的位置关系(第1课时)(导学案)(原卷版)
- 2024浙江绍兴市人才发展集团第1批招聘4人(第1号)高频难、易错点500题模拟试题附带答案详解
- 幼儿园说课概述-课件
- XX有限公司人员分流方案
- 冠状动脉介入风险预测评分的临床应用
- 35导数在经济中的应用
- 苏科版(2024新版)七年级上册数学期中学情评估测试卷(含答案)
- 部编版《道德与法治》三年级上册第10课《父母多爱我》教学课件
- 大语言模型赋能自动化测试实践、挑战与展望-复旦大学(董震)
- 期中模拟检测(1-3单元)2024-2025学年度第一学期西师大版二年级数学
- 气管插管操作规范(完整版)
评论
0/150
提交评论