Android-ansync-http开源框架,详情见GitHub:https://github.com/loopj/android-async-http。
Android端实现文件的上传,代码如有雷同纯属开源!
服务端实现(使用Servlet):
UpLoadServle.java(只贴关键代码,剩下的自动生成的就不了。。。),用到的jar包commons-fileupload-1.2.1.jar,commons-io-1.3.2.jar
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
this.doPost(request, response);
}
关键看这里
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
boolean isMultipart = ServletFileUpload.isMultipartContent(request);
if (isMultipart) {// 判断提交上来的数据是否是表单的数据
//文件存放位置:服务目录下的upload(如:默认TomCat部署目录X:\Workspace\.metadata\.me_tcat\webapps\工程名\upload)
String realPath = getServletContext().getRealPath("upload");
File dir = new File(realPath);
if (!dir.exists()) {
dir.mkdir();
}
DiskFileItemFactory factory = new DiskFileItemFactory();// 1、创建一个DiskFileItemFactory工厂
ServletFileUpload upload = new ServletFileUpload(factory);// 2、创建一个文件上传解析器
upload.setHeaderEncoding("utf-8");//编码方式
try {
// 4、使用ServletFileUpload解析器解析上传的数据,解析结果是一个List<FileItem>
// 集合,每一个FileItem对应一个Form表单的输入项
List<FileItem> items = upload.parseRequest(request);
for (FileItem item : items) {
if (item.isFormField()) {//如果是文本
String name = item.getFieldName();
String value = item.getString("utf-8");//以utf-8进行编码
System.out.println(name);
} else {// 如果是文件
String filename = item.getName();
// System.out.println("filename=" + filename);
if (null == filename || "".equals(filename.trim())) {
continue;
}
filename = filename.substring(filename
.lastIndexOf("\\") + 1);//将文件名剪出
InputStream is = item.getInputStream();//得到上传的输入流
FileOutputStream out = new FileOutputStream("F:\\"
+ filename);//创建写入磁盘的输出流
byte[] b = new byte[1024 * 1024];//缓冲区
int len = 0;
while ((len = is.read(b)) != -1) {
out.write(b, 0, len);
out.flush();
}
is.close();
out.close();
// 处理文件上传时生成的临时文件
item.delete();
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
别忘了在web.xml注册servlet
<servlet>
<description>This is the description of my J2EE component</description>
<display-name>This is the display name of my J2EE component</display-name>
<servlet-name>UpLoadServlet</servlet-name>
<servlet-class>com.ql.UpLoadServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>UpLoadServlet</servlet-name>
<url-pattern>/UpLoadServlet</url-pattern>
</servlet-mapping>
服务器端完工。。。
Android端
界面:
Java代码:用到的jar包android-async-http-1.4.9.jar,httpclient-4.4.1.1.jar
直接贴代码,懒得分了
package com.ql.fileuploaddemo;
import java.io.File;
import com.loopj.android.http.AsyncHttpClient;
import com.loopj.android.http.AsyncHttpResponseHandler;
import com.loopj.android.http.RequestParams;
import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.database.Cursor;
import android.net.Uri;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ProgressBar;
import android.widget.TextView;
import android.widget.Toast;
import cz.msebera.android.httpclient.Header;
public class MainActivity extends Activity {
private static final int FILE_SELECT_CODE = 0;
protected static final String TAG = "QL";
Handler handler = new Handler() {
public void handleMessage(Message msg) {
if (msg.what == 1) {
String path = (String) msg.obj;
editText.setText(path);
}
if (msg.what == 2) {
int progress = (int) msg.arg1;
MainActivity.this.progressBar.setProgress(progress);
int a = msg.arg2;
textView.setText(a + "%");
}
if (msg.what == 3) {
String string = (String) msg.obj;
textView2.setText("" + string);
}
}
};
private EditText editText;
private ProgressBar progressBar;
private TextView textView;
private TextView textView2;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
editText = (EditText) findViewById(R.id.editText1);
progressBar = (ProgressBar) findViewById(R.id.progressBar1);
textView = (TextView) findViewById(R.id.textView1);
textView2 = (TextView) findViewById(R.id.textView2);
Button button = (Button) findViewById(R.id.button1);
button.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
showFileChooser();
}
});
Button button2 = (Button) findViewById(R.id.button2);
button2.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
UpLoad();
}
});
}
/**
* 上传
*/
protected void UpLoad() {
progressBar.setProgress(0);
AsyncHttpClient client = new AsyncHttpClient();//实例化上传对象
String url = "http://10.86.30.38:8080/UpLoad/UpLoadServlet";//url组成:ip:端口 + 服务端工程名 + servlet名
String path = editText.getText().toString().trim();
if (null != path && "" != path) {
File file = new File(path);
if (file.exists() && file.length() > 0) {
RequestParams params = new RequestParams();
try {
params.put("profile", file);//将文件加入参数
} catch (Exception e) {
e.printStackTrace();
}
//上传文件
client.post(url, params, new AsyncHttpResponseHandler() {
@Override//失败的监听
public void onFailure(int statusCode, Header[] headers, byte[] responseBody, Throwable error) {
Message msg = handler.obtainMessage();
msg.what = 3;
msg.obj = "上传失败!";
handler.sendMessage(msg);
error.printStackTrace();
}
@Override//成功的监听
public void onSuccess(int statusCode, Header[] headers, byte[] responseBody) {
Message msg = handler.obtainMessage();
msg.what = 3;
msg.obj = "上传成功!";
handler.sendMessage(msg);
}
@Override//动态变化
public void onProgress(final long bytesWritten, final long totalSize) {
super.onProgress(bytesWritten, totalSize);
progressBar.setMax((int) totalSize);
float a = (float) bytesWritten / (float) totalSize;
Message msg = handler.obtainMessage();
msg.what = 2;
msg.arg1 = (int) bytesWritten;
msg.arg2 = (int) (a * 100f);
handler.sendMessage(msg);
}
});
}
}
}
/**
* 选择文件
*/
private void showFileChooser() {
Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
intent.setType("*/*");//过滤文件类型(所有)
intent.addCategory(Intent.CATEGORY_OPENABLE);
try {
startActivityForResult(Intent.createChooser(intent, "请选择文件!"), FILE_SELECT_CODE);
} catch (android.content.ActivityNotFoundException ex) {
Toast.makeText(this, "未安装文件管理器!", Toast.LENGTH_SHORT).show();
}
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
switch (requestCode) {
case FILE_SELECT_CODE:
if (resultCode == RESULT_OK) {
Uri uri = data.getData();
String path = FileUtils.getPath(this, uri);//得到文件路径
Message msg = handler.obtainMessage();
msg.what = 1;
msg.obj = path;
handler.sendMessage(msg);
}
break;
}
}
/**
* 文件工具类
* @author ql
*
*/
static class FileUtils {
public static String getPath(Context context, Uri uri) {
if ("content".equalsIgnoreCase(uri.getScheme())) {
String[] projection = { "_data" };
Cursor cursor = null;
try {
cursor = context.getContentResolver().query(uri, projection, null, null, null);
int column_index = cursor.getColumnIndexOrThrow("_data");
if (cursor.moveToFirst()) {
return cursor.getString(column_index);
}
} catch (Exception e) {
e.printStackTrace();
}
} else if ("file".equalsIgnoreCase(uri.getScheme())) {
return uri.getPath();
}
return null;
}
}
}
别忘了给权限
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
效果: