android对于上传文件,还是很简单的,和java里面的上传都是一样的,基本上都是熟悉操作输出流和输入流!还有一个特别重要的就是需要一些content-type这些参数的配置! 如果这些都弄好了,上传就很简单了! 下面是一个上传的工具类:
package com.spring.sky.image.upload.network; 
import java.io.DataOutputStream; 
import java.io.File; 
import java.io.FileInputStream; 
import java.io.IOException; 
import java.io.InputStream; 
import java.net.HttpURLConnection; 
import java.net.MalformedURLException; 
import java.net.URL; 
import java.util.UUID; 
import android.util.Log; 
/**
* 
* 上传工具类
* @author spring sky
* Email:vipa1888@163.com
* QQ:840950105 www.2cto.com
* MyName:石明政
*/ 
public class UploadUtil { 
private static final String TAG = "uploadFile"; 
private static final int TIME_OUT = 10*1000; //超时时间 
private static final String CHARSET = "utf-8"; //设置编码 
/**
* android上传文件到服务器
* @param file 需要上传的文件
* @param RequestURL 请求的rul
* @return 返回响应的内容
*/ 
public static String uploadFile(File file,String RequestURL) 
{ 
String result = null; 
String BOUNDARY = UUID.randomUUID().toString(); //边界标识 随机生成 
String PREFIX = "--" , LINE_END = "\r\n"; 
String CONTENT_TYPE = "multipart/form-data"; //内容类型 
try { 
URL url = new URL(RequestURL); 
HttpURLConnection conn = (HttpURLConnection) url.openConnection(); 
conn.setReadTimeout(TIME_OUT); 
conn.setConnectTimeout(TIME_OUT); 
conn.setDoInput(true); //允许输入流 
conn.setDoOutput(true); //允许输出流 
conn.setUseCaches(false); //不允许使用缓存 
conn.setRequestMethod("POST"); //请求方式 
conn.setRequestProperty("Charset", CHARSET); //设置编码 
conn.setRequestProperty("connection", "keep-alive"); 
conn.setRequestProperty("Content-Type", CONTENT_TYPE + ";boundary=" + BOUNDARY); 
if(file!=null) 
{ 
/**
* 当文件不为空,把文件包装并且上传
*/ 
DataOutputStream dos = new DataOutputStream( conn.getOutputStream()); 
StringBuffer sb = new StringBuffer(); 
sb.append(PREFIX); 
sb.append(BOUNDARY); 
sb.append(LINE_END); 
/**
* 这里重点注意:
* name里面的值为服务器端需要key 只有这个key 才可以得到对应的文件
* filename是文件的名字,包含后缀名的 比如:abc.png 
*/ 
sb.append("Content-Disposition: form-data; name=\"img\"; filename=\""+file.getName()+"\""+LINE_END); 
sb.append("Content-Type: application/octet-stream; charset="+CHARSET+LINE_END); 
sb.append(LINE_END); 
dos.write(sb.toString().getBytes()); 
InputStream is = new FileInputStream(file); 
byte[] bytes = new byte[1024]; 
int len = 0; 
while((len=is.read(bytes))!=-1) 
{ 
dos.write(bytes, 0, len); 
} 
is.close(); 
dos.write(LINE_END.getBytes()); 
byte[] end_data = (PREFIX+BOUNDARY+PREFIX+LINE_END).getBytes(); 
dos.write(end_data); 
dos.flush(); 
/**
* 获取响应码 200=成功
* 当响应成功,获取响应的流 
*/ 
int res = conn.getResponseCode(); 
Log.e(TAG, "response code:"+res); 
// if(res==200) 
// { 
Log.e(TAG, "request success"); 
InputStream input = conn.getInputStream(); 
StringBuffer sb1= new StringBuffer(); 
int ss ; 
while((ss=input.read())!=-1) 
{ 
sb1.append((char)ss); 
} 
result = sb1.toString(); 
Log.e(TAG, "result : "+ result); 
// } 
// else{ 
// Log.e(TAG, "request error"); 
// } 
} 
} catch (MalformedURLException e) { 
e.printStackTrace(); 
} catch (IOException e) { 
e.printStackTrace(); 
} 
return result; 
} 
} 
参数就一个File文件和一个请求上传的URL,不过需要注意的是 ,因为需要用到了网络请求,所以大家可不要忘记在上传的时候,给android客户端加一个访问王珞丹呃权限哦! 
还有一点就是需要大家注意一下:本人是做服务器端javaEE的,我发现在上传的过程中,如果文件的标识name是java关键字之类的,上传过程中,会存在很多位置的问题的!所以大家经可能的不要使用关键字哦!
下面是Activity的代码:
package com.spring.sky.image.upload; 
import java.io.File; 
import com.spring.sky.image.upload.network.UploadUtil; 
import android.app.Activity; 
import android.app.AlertDialog; 
import android.app.Dialog; 
import android.content.ContentResolver; 
import android.content.DialogInterface; 
import android.content.Intent; 
import android.database.Cursor; 
import android.graphics.Bitmap; 
import android.graphics.BitmapFactory; 
import android.net.Uri; 
import android.os.Bundle; 
import android.provider.MediaStore; 
import android.util.Log; 
import android.view.View; 
import android.view.View.OnClickListener; 
import android.widget.Button; 
import android.widget.ImageView; 
/**
* Activity 上传的界面
* @author spring sky
* Email:vipa1888@163.com
* QQ:840950105
* MyName:石明政
*
*/ 
public class MainActivity extends Activity implements OnClickListener{ 
private static final String TAG = "uploadImage"; 
private static String requestURL = "http://192.168.1.14:8080/SetBlobData/img!up"; 
private Button selectImage,uploadImage; 
private ImageView imageView; 
private String picPath = null; 
/** Called when the activity is first created. */ 
@Override 
public void onCreate(Bundle savedInstanceState) { 
super.onCreate(savedInstanceState); 
setContentView(R.layout.main); 
selectImage = (Button) this.findViewById(R.id.selectImage); 
uploadImage = (Button) this.findViewById(R.id.uploadImage); 
selectImage.setOnClickListener(this); 
uploadImage.setOnClickListener(this); 
imageView = (ImageView) this.findViewById(R.id.imageView); 
} 
@Override 
public void onClick(View v) { 
switch (v.getId()) { 
case R.id.selectImage: 
/***
* 这个是调用android内置的intent,来过滤图片文件 ,同时也可以过滤其他的 
*/ 
Intent intent = new Intent(); 
intent.setType("image/*"); 
intent.setAction(Intent.ACTION_GET_CONTENT); 
startActivityForResult(intent, 1); 
break; 
case R.id.uploadImage: 
File file = new File(picPath); 
if(file!=null) 
{ 
String request = UploadUtil.uploadFile( file, requestURL); 
uploadImage.setText(request); 
} 
break; 
default: 
break; 
} 
} 
@Override 
protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
if(resultCode==Activity.RESULT_OK) 
{ 
/** 
* 当选择的图片不为空的话,在获取到图片的途径 
*/ 
Uri uri = data.getData(); 
Log.e(TAG, "uri = "+ uri); 
try { 
String[] pojo = {MediaStore.Images.Media.DATA}; 
Cursor cursor = managedQuery(uri, pojo, null, null,null); 
if(cursor!=null) 
{ 
ContentResolver cr = this.getContentResolver(); 
int colunm_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA); 
cursor.moveToFirst(); 
String path = cursor.getString(colunm_index); 
/***
* 这里加这样一个判断主要是为了第三方的软件选择,比如:使用第三方的文件管理器的话,你选择的文件就不一定是图片了,这样的话,我们判断文件的后缀名
* 如果是图片格式的话,那么才可以 
*/ 
if(path.endsWith("jpg")||path.endsWith("png")) 
{ 
picPath = path; 
Bitmap bitmap = BitmapFactory.decodeStream(cr.openInputStream(uri)); 
imageView.setImageBitmap(bitmap); 
}else{alert();} 
}else{alert();} 
} catch (Exception e) { 
} 
} 
super.onActivityResult(requestCode, resultCode, data); 
} 
private void alert() 
{ 
Dialog dialog = new AlertDialog.Builder(this) 
.setTitle("提示") 
.setMessage("您选择的不是有效的图片") 
.setPositiveButton("确定", 
new DialogInterface.OnClickListener() { 
public void onClick(DialogInterface dialog, 
int which) { 
picPath = null; 
} 
}) 
.create(); 
dialog.show(); 
} 
} 
layout代码:
<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:orientation="vertical" 
android:layout_width="fill_parent" 
android:layout_height="fill_parent" 
> 
<Button 
android:layout_width="fill_parent" 
android:layout_height="wrap_content" 
android:text="选择图片" 
android:id="@+id/selectImage" 
/> 
<Button 
android:layout_width="fill_parent" 
android:layout_height="wrap_content" 
android:text="上传图片" 
android:id="@+id/uploadImage" 
/> 
<ImageView 
android:layout_width="wrap_content" 
android:layout_height="wrap_content" 
android:id="@+id/imageView" 
/> 
</LinearLayout> 
以上就是android 上传图片的全部代码,如果想上传其他文件的话,可以修改过滤条件就可以了,同时文件的类型一定要和服务器端的文件类型保持一致,否则上传就失败了!