




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
【移动应用开发技术】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~2025学年高一下册期末考试数学试题学生卷
- 福建福州第八中学2024~2025学年高一下册期末数学试题
- 生产工艺流程控制考核试卷
- 农机驾驶培训教程课件
- JT-T 329-2025 公路桥梁预应力钢绞线用锚具、夹具和连接器
- 开利42CE系列风机盘管最新版样本
- 木托盘采购合同
- 2016年湖北省咸宁市中考数学试卷(解析版)(共22页)
- 亿赛通电子文档安全管理系统V5.0--系统安装手册V11
评论
0/150
提交评论