【移动应用开发技术】Android中怎么利用OkHttp上传文件到服务器_第1页
【移动应用开发技术】Android中怎么利用OkHttp上传文件到服务器_第2页
【移动应用开发技术】Android中怎么利用OkHttp上传文件到服务器_第3页
【移动应用开发技术】Android中怎么利用OkHttp上传文件到服务器_第4页
【移动应用开发技术】Android中怎么利用OkHttp上传文件到服务器_第5页
已阅读5页,还剩5页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

【移动应用开发技术】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. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论