java 上传图片到服务器

本博客介绍了一个Android应用如何通过用户选择本地图片或拍照上传,然后使用Apache HttpClient库将图片上传至指定服务器的过程。包括用户界面设计、图片预览、文件路径管理、服务器端接收与存储图片的实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

客户端代码:
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);
	}

}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序猿老王

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值