android 上传文件到服务器
Android客户端
package com.example.testandroid; |
import java.io.DataOutputStream; |
import java.io.FileInputStream; |
import java.io.InputStream; |
import java.net.HttpURLConnection; |
import java.net.URL; |
import android.app.Activity; |
import android.app.AlertDialog; |
import android.content.DialogInterface; |
import android.os.Bundle; |
import android.view.View; |
import android.widget.Button; |
import android.widget.TextView; |
public class PhotoUpload extends Activity { |
private String newName = "image.jpg" ; |
private String uploadFile = "/sdcard/image.JPG" ; // 要上传的文件 |
private String actionUrl = "http://192.168.0.1:8080/PhotoUpload/servlet/UploadServlet" ; |
private TextView mText1; |
private TextView mText2; |
private Button mButton; |
@Override |
public void onCreate(Bundle savedInstanceState) { |
super .onCreate(savedInstanceState); |
setContentView(R.layout.activity_main); |
mText1 = (TextView) findViewById(R.id.myText2); |
// 文件路径: |
mText1.setText(uploadFile); |
mText2 = (TextView) findViewById(R.id.myText3); |
// 上传网址: |
mText2.setText(actionUrl); |
/* 设置mButton的onClick事件处理 */ |
mButton = (Button) findViewById(R.id.myButton); |
mButton.setOnClickListener( new View.OnClickListener() { |
public void onClick(View v) { |
uploadFile(); |
} |
}); |
} |
/* 上传文件至Server的方法 */ |
private void uploadFile() { |
String end = "\r\n" ; |
String twoHyphens = "--" ; |
String boundary = "*****" ; |
try { |
URL url = new URL(actionUrl); |
HttpURLConnection con = (HttpURLConnection) url.openConnection(); |
/* 允许Input、Output,不使用Cache */ |
con.setDoInput( true ); |
con.setDoOutput( true ); |
con.setUseCaches( false ); |
// 设置http连接属性 |
con.setRequestMethod( "POST" ); |
con.setRequestProperty( "Connection" , "Keep-Alive" ); |
con.setRequestProperty( "Charset" , "UTF-8" ); |
con.setRequestProperty( "Content-Type" , |
"multipart/form-data;boundary=" + boundary); |
DataOutputStream ds = new DataOutputStream(con.getOutputStream()); |
ds.writeBytes(twoHyphens + boundary + end); |
ds.writeBytes( "Content-Disposition: form-data; " |
+ "name=\"file1\";filename=\"" + newName + "\"" + end); |
ds.writeBytes(end); |
// 取得文件的FileInputStream |
FileInputStream fStream = new FileInputStream(uploadFile); |
/* 设置每次写入1024bytes */ |
int bufferSize = 1024 ; |
byte [] buffer = new byte [bufferSize]; |
int length = - 1 ; |
/* 从文件读取数据至缓冲区 */ |
while ((length = fStream.read(buffer)) != - 1 ) { |
/* 将资料写入DataOutputStream中 */ |
ds.write(buffer, 0 , length); |
} |
ds.writeBytes(end); |
ds.writeBytes(twoHyphens + boundary + twoHyphens + end); |
fStream.close(); |
ds.flush(); |
/* 取得Response内容 */ |
InputStream is = con.getInputStream(); |
int ch; |
StringBuffer b = new StringBuffer(); |
while ((ch = is.read()) != - 1 ) { |
b.append(( char ) ch); |
} |
/* 将Response显示于Dialog */ |
showDialog( "上传成功" + b.toString().trim()); |
/* 关闭DataOutputStream */ |
ds.close(); |
} catch (Exception e) { |
showDialog( "上传失败" + e); |
} |
} |
/* 显示Dialog的method */ |
private void showDialog(String mess) { |
new AlertDialog.Builder(PhotoUpload. this ).setTitle( "Message" ) |
.setMessage(mess) |
.setNegativeButton( "确定" , new DialogInterface.OnClickListener() { |
public void onClick(DialogInterface dialog, int which) { |
} |
}).show(); |
} |
} |
服务器端servlet
package com.demo; |
import java.io.File; |
import java.io.IOException; |
import java.util.Date; |
import java.util.Iterator; |
import java.util.List; |
import javax.servlet.ServletException; |
import javax.servlet.http.HttpServlet; |
import javax.servlet.http.HttpServletRequest; |
import javax.servlet.http.HttpServletResponse; |
import org.apache.commons.fileupload.DiskFileUpload; |
import org.apache.commons.fileupload.FileItem; |
public class UploadServlet extends HttpServlet { |
public void doPost(HttpServletRequest request, HttpServletResponse response) |
throws ServletException, IOException { |
String temp = request.getSession().getServletContext().getRealPath( "/" ) |
+ "temp" ; // 临时目录 |
System.out.println( "temp=" + temp); |
String loadpath = request.getSession().getServletContext() |
.getRealPath( "/" ) |
+ "Image" ; // 上传文件存放目录 |
System.out.println( "loadpath=" + loadpath); |
DiskFileUpload fu = new DiskFileUpload(); // 需要导入commons-fileupload-1.2.2.jar |
fu.setSizeMax( 1 * 1024 * 1024 ); // 设置允许用户上传文件大小,单位:字节 |
fu.setSizeThreshold( 4096 ); // 设置最多只允许在内存中存储的数据,单位:字节 |
fu.setRepositoryPath(temp); // 设置一旦文件大小超过getSizeThreshold()的值时数据存放在硬盘的目录 |
// 开始读取上传信息 |
int index = 0 ; |
List fileItems = null ; |
try { |
fileItems = fu.parseRequest(request); |
System.out.println( "fileItems=" + fileItems); |
} catch (Exception e) { |
e.printStackTrace(); |
} |
Iterator iter = fileItems.iterator(); // 依次处理每个上传的文件 |
while (iter.hasNext()) { |
FileItem item = (FileItem) iter.next(); // 忽略其他不是文件域的所有表单信息 |
if (!item.isFormField()) { |
String name = item.getName(); // 获取上传文件名,包括路径 |
name = name.substring(name.lastIndexOf( "\\" ) + 1 ); // 从全路径中提取文件名 |
long size = item.getSize(); |
if ((name == null || name.equals( "" )) && size == 0 ) |
continue ; |
int point = name.indexOf( "." ); |
name = ( new Date()).getTime() |
+ name.substring(point, name.length()) + index; |
index++; |
File fNew = new File(loadpath, name); |
try { |
item.write(fNew); |
} catch (Exception e) { |
// TODO Auto-generated catch block |
e.printStackTrace(); |
} |
} else // 取出不是文件域的所有表单信息 |
{ |
String fieldvalue = item.getString(); |
// 如果包含中文应写为:(转为UTF-8编码) |
// String fieldvalue = new |
// String(item.getString().getBytes(),"UTF-8"); |
} |
} |
String text1 = "11" ; |
response.sendRedirect( "result.jsp?text1=" + text1); |
} |
} |
activity_main.xml
< RelativeLayout xmlns:android = "http://schemas.android.com/apk/res/android" |
xmlns:tools = "http://schemas.android.com/tools" |
android:layout_width = "match_parent" |
android:layout_height = "match_parent" > |
< EditText |
android:id = "@+id/myText2" |
android:layout_width = "wrap_content" |
android:layout_height = "wrap_content" |
android:layout_alignParentTop = "true" |
android:layout_centerHorizontal = "true" |
android:layout_marginTop = "116dp" |
android:ems = "10" |
android:inputType = "textPersonName" /> |
< EditText |
android:id = "@+id/myText3" |
android:layout_width = "wrap_content" |
android:layout_height = "wrap_content" |
android:layout_alignLeft = "@+id/myText2" |
android:layout_below = "@+id/myText2" |
android:layout_marginTop = "45dp" |
android:ems = "10" /> |
< Button |
android:id = "@+id/myButton" |
android:layout_width = "wrap_content" |
android:layout_height = "wrap_content" |
android:layout_below = "@+id/myText3" |
android:layout_centerHorizontal = "true" |
android:layout_marginTop = "61dp" |
android:text = "上传" /> |
</ RelativeLayout > |