客户端代码:
package com.example.test;
import java.io.DataOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.RandomAccessFile;
import java.net.HttpURLConnection;
import java.net.URL;
import org.apache.http.impl.client.BasicCookieStore;
import org.apache.http.impl.cookie.BasicClientCookie;
import com.nostra13.universalimageloader.core.DisplayImageOptions;
import com.nostra13.universalimageloader.core.ImageLoader;
import android.app.Activity;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.Drawable;
import android.net.Uri;
import android.os.Bundle;
import android.os.Environment;
import android.provider.MediaStore;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.ImageView;
public class PictureActivity extends Activity implements OnClickListener {
Button button;
ImageView imageView;
ImageLoader imageLoader = ImageLoader.getInstance();
DisplayImageOptions options;
// String uri = "http://192.168.1.125:8080/upload/upload/image.jpg";
private String actionUrl = "http://www.todoo.im/?p=api&m=avatars";
String pidString = "pid=52";
private String newName = "image.jpg";
private String uploadFile = "/sdcard/image.jpg";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.picture);
button = (Button) findViewById(R.id.button);
button.setOnClickListener(this);
imageView = (ImageView) findViewById(R.id.image);
options = new DisplayImageOptions.Builder()
.showImageForEmptyUri(R.drawable.head).cacheInMemory()
.cacheOnDisc().bitmapConfig(Bitmap.Config.RGB_565).build();
// imageLoader.displayImage(uri, imageView, options);
}
@Override
public void onClick(View arg0) {
switch (arg0.getId()) {
case R.id.button:
showDialog();
break;
default:
break;
}
}
private void showDialog() {
new AlertDialog.Builder(this)
.setTitle("设置头像")
.setNegativeButton("本地上传",
new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface arg0, int arg1) {
arg0.dismiss();
Intent intent1 = new Intent(Intent.ACTION_PICK,
null);
intent1.setDataAndType(
MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
"image/*");
startActivityForResult(intent1, 1);
}
})
.setPositiveButton("拍照上传",
new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface arg0, int arg1) {
arg0.dismiss();
Intent intent = new Intent(
MediaStore.ACTION_IMAGE_CAPTURE);
intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri
.fromFile(new File(Environment
.getExternalStorageDirectory(),
"image.jpg")));
startActivityForResult(intent, 2);
}
}).show();
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
switch (requestCode) {
case 1:
startPhotoZoom(data.getData());
break;
case 2:
File temp = new File(Environment.getExternalStorageDirectory()
+ "/image.jpg");
startPhotoZoom(Uri.fromFile(temp));
break;
case 3:
if (data != null) {
setPicToView(data);
new Thread(new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
uploadFile();
}
}).start();
}
break;
default:
break;
}
super.onActivityResult(requestCode, resultCode, data);
}
private void startPhotoZoom(Uri uri) {
Intent intent = new Intent("com.android.camera.action.CROP");
intent.setDataAndType(uri, "image/*");
intent.putExtra("crop", "true");
intent.putExtra("aspectX", 1);
intent.putExtra("aspectY", 1);
intent.putExtra("outputX", 150);
intent.putExtra("outputY", 150);
intent.putExtra("return-data", true);
startActivityForResult(intent, 3);
}
private void setPicToView(Intent picdata) {
Bundle extras = picdata.getExtras();
File file = new File(uploadFile);
FileOutputStream fOut = null;
if (extras != null) {
Bitmap photo = extras.getParcelable("data");
try {
fOut = new FileOutputStream(file);
photo.compress(Bitmap.CompressFormat.JPEG, 100, fOut);
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
try {
fOut.flush();
} catch (IOException e) {
e.printStackTrace();
}
try {
fOut.close();
} catch (IOException e) {
e.printStackTrace();
}
}
// Drawable drawable = new BitmapDrawable(photo);
// imageView.setBackgroundDrawable(drawable);
// imageLoader.displayImage(uri, imageView, options);
}
}
/* 上传文件至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 */
// BasicCookieStore newStore = new BasicCookieStore();
// BasicClientCookie c1 = new BasicClientCookie("Doer_uid", "21");
// c1.setDomain("www.todoo.im");
// c1.setPath("/");
// newStore.addCookie(c1);
//
// BasicClientCookie c2 = new BasicClientCookie("Doer_pwd",
// "ed431d1e9f55d20141adf71e75ad3ffb");
// System.out.println("---------"+c2.toString());
con.setRequestProperty("Cookie",
"Doer_uid=21;Doer_pwd=ed431d1e9f55d20141adf71e75ad3ffb");
// CookieObj [name=Doer_pwd, value=ed431d1e9f55d20141adf71e75ad3ffb]
con.setDoInput(true);
con.setDoOutput(true);
con.setUseCaches(false);
/* 设置传送的method=POST */
con.setRequestMethod("POST");
/* setRequestProperty */
con.setRequestProperty("Connection", "Keep-Alive");
con.setRequestProperty("Charset", "UTF-8");
con.setRequestProperty("Content-Type",
"multipart/form-data;boundary=" + boundary);
con.connect();
/* 设置DataOutputStream */
DataOutputStream ds = new DataOutputStream(con.getOutputStream());
ds.writeBytes(twoHyphens + boundary + end);
// ds.writeBytes(pidString);
// ds.writeBytes(end);
ds.writeBytes("Content-Disposition: form-data; "
+ "name=\"upload_file\";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);
/* close streams */
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());
System.out.println("---------" + b.toString().trim());
/* 关闭DataOutputStream */
ds.close();
} catch (Exception e) {
// showDialog("上传失败" + e);
e.printStackTrace();
}
}
/* 显示Dialog的method */
private void showDialog(String mess) {
new AlertDialog.Builder(this).setTitle("Message").setMessage(mess)
.setNegativeButton("确定", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
}
}).show();
}
}
服务器端代码:
package yao.web;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
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.FileItem;
import org.apache.commons.fileupload.FileUploadBase;
import org.apache.commons.fileupload.ProgressListener;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
public class UploadServlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
try {
System.out.println("IP:" + request.getRemoteAddr());
// 1、创建工厂类:DiskFileItemFactory
DiskFileItemFactory facotry = new DiskFileItemFactory();
String tempDir = getServletContext().getRealPath("/WEB-INF/temp");
facotry.setRepository(new File(tempDir));//设置临时文件存放目录
// 2、创建核心解析类:ServletFileUpload
ServletFileUpload upload = new ServletFileUpload(facotry);
upload.setHeaderEncoding("UTF-8");// 解决上传的文件名乱码
upload.setFileSizeMax(1024 * 1024 * 1024);// 单个文件上传最大值是1M
upload.setSizeMax(2048 * 1024 * 1024);//文件上传的总大小限制
// 3、判断用户的表单提交方式是不是multipart/form-data
boolean bb = upload.isMultipartContent(request);
if (!bb) {
return;
}
// 4、是:解析request对象的正文内容List<FileItem>
List<FileItem> items = upload.parseRequest(request);
String storePath = getServletContext().getRealPath(
"/upload");// 上传的文件的存放目录
for (FileItem item : items) {
if (item.isFormField()) {
// 5、判断是否是普通表单:打印看看
String fieldName = item.getFieldName();// 请求参数名
String fieldValue = item.getString("UTF-8");// 请求参数值
System.out.println(fieldName + "=" + fieldValue);
} else {
// 6、上传表单:得到输入流,处理上传:保存到服务器的某个目录中,保存时的文件名是啥?
String fileName = item.getName();// 得到上传文件的名称 C:\Documents
// and
// Settings\shc\桌面\a.txt
// a.txt
//解决用户没有选择文件上传的情况
if(fileName==null||fileName.trim().equals("")){
continue;
}
fileName = fileName
.substring(fileName.lastIndexOf("\\") + 1);
String newFileName = fileName;
System.out.println("上传的文件名是:" + fileName);
InputStream in = item.getInputStream();
String savePath = makeDir(storePath, fileName) + "\\"
+ newFileName;
OutputStream out = new FileOutputStream(savePath);
byte b[] = new byte[1024];
int len = 0;
while ((len = in.read(b)) != -1) {
out.write(b, 0, len);
}
in.close();
out.close();
item.delete();//删除临时文件
}
}
}catch(FileUploadBase.FileSizeLimitExceededException e){
request.setAttribute("message", "单个文件大小不能超出5M");
request.getRequestDispatcher("/message.jsp").forward(request,
response);
}catch(FileUploadBase.SizeLimitExceededException e){
request.setAttribute("message", "总文件大小不能超出7M");
request.getRequestDispatcher("/message.jsp").forward(request,
response);
}catch (Exception e) {
e.printStackTrace();
request.setAttribute("message", "上传失败");
request.getRequestDispatcher("/message.jsp").forward(request,
response);
}
}
// WEB-INF/upload/1/3 打散存储目录
private String makeDir(String storePath, String fileName) {
int hashCode = fileName.hashCode();// 得到文件名的hashcode码
int dir1 = hashCode & 0xf;// 取hashCode的低4位 0~15
int dir2 = (hashCode & 0xf0) >> 4;// 取hashCode的高4位 0~15
String path = storePath;
File file = new File(path);
if (!file.exists())
file.mkdirs();
return path;
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
}