Android上传图片到本地服务器
来源:互联网 发布:淘宝V6会员贷款 编辑:程序博客网 时间:2024/06/12 05:56
先把客户端代码给贴上
package com.example.administrator.myapplication;import android.app.Activity;import android.content.Intent;import android.graphics.Bitmap;import android.graphics.BitmapFactory;import android.net.Uri;import android.os.Bundle;import android.os.Environment;import android.os.Handler;import android.os.Message;import android.provider.MediaStore;import android.support.v7.app.ActionBarActivity;import android.util.Log;import android.view.View;import android.widget.Button;import android.widget.ImageView;import android.widget.Toast;import java.io.DataOutputStream;import java.io.File;import java.io.FileInputStream;import java.io.InputStream;import java.net.HttpURLConnection;import java.net.MalformedURLException;import java.net.URL;import java.text.SimpleDateFormat;import java.util.Date;import java.util.UUID;public class SecondActivity extends ActionBarActivity { private Button photoButton = null; private Button uploadButton = null; private ImageView imageView = null; private static final int CAPTURE_IMAGE_ACTIVITY_REQUEST_CODE = 100; private static final int MEDIA_TYPE_IMAGE = 1; private static final String LOG_TAG = "CameraActivity"; private Uri fileUri = null; public static File mediaFile; private Handler handler; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_second); photoButton = (Button) findViewById(R.id.photoButton); uploadButton = (Button) findViewById(R.id.uploadButton); imageView = (ImageView) findViewById(R.id.imageView); TakePicListener captureListener = new TakePicListener(); photoButton.setOnClickListener(captureListener); UploadListener ul = new UploadListener(); uploadButton.setOnClickListener(ul); handler = new Handler() { @Override public void handleMessage(Message msg) { String result = msg.obj.toString(); if (result.equals(FileImageUpload.SUCCESS)) { Toast.makeText(SecondActivity.this, "上传成功!", Toast.LENGTH_SHORT).show(); } else if (result.equals(FileImageUpload.FAILURE)) { Toast.makeText(SecondActivity.this, "上传失败!!", Toast.LENGTH_SHORT).show(); } } }; } //监听拍照 class TakePicListener implements View.OnClickListener { @Override public void onClick(View v) { System.out.println("Take picture Button Click"); //调用系统自带的相机 Intent takePic = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); fileUri = Uri.fromFile(getOutPutMediaFile(MEDIA_TYPE_IMAGE)); //下面这段使得照片存储到指定的位置 takePic.putExtra(MediaStore.EXTRA_OUTPUT, fileUri); //跳转到系统相机,并且返回相片数据,在OnActivityForResult方法中处理数据 startActivityForResult(takePic, CAPTURE_IMAGE_ACTIVITY_REQUEST_CODE); } } //监听上传 class UploadListener implements View.OnClickListener { @Override public void onClick(View v) { System.out.println("Upload Button clicked!"); //文件上传需要消耗很多时间,需要在WorkerThread中进行,否则UI线程会阻塞 UploadThread ut = new UploadThread(mediaFile); ut.start(); } } //新建一个WorkerThread,在uploadButton中要连接服务器,不能在UI线程中连接 class UploadThread extends Thread { //需要上传的文件 private File mUploadFile; public UploadThread(File file) { this.mUploadFile = file; } @Override public void run() { String flag = FileImageUpload.uploadFile(mUploadFile.getName()); Message msg = handler.obtainMessage(); msg.obj = flag; handler.sendMessage(msg); } } private File getOutPutMediaFile(int type) { //检查sd卡状态 String sdStatus = Environment.getExternalStorageState(); if (!sdStatus.equals(Environment.MEDIA_MOUNTED)) { System.out.println("SD Card is not available!"); return null; } File mediaStorageDir = null; try { //在sd卡目录下面新建一个文件夹 mediaStorageDir = new File(Environment.getExternalStorageDirectory().getAbsolutePath() + "/MyPicture"); System.out.println("Successfully created mediaStorageDir: " + mediaStorageDir); } catch (Exception e) { e.printStackTrace(); System.out.println("Error int Creating mediaStorageDir: " + mediaStorageDir); } //检查目录是否创建成功 if (!mediaStorageDir.exists()) { if (!mediaStorageDir.mkdirs()) { //在sd卡上穿件目录需要权限 System.out.println("failed to create directory, check if you have the WRITE_EXTERNAL_STORAGE permission"); return null; } } //创建图片名字,图片名字不要太长,原因不明。。。 String timeStamp = new SimpleDateFormat("hhmmss").format(new Date()); //在mediaStorageDir目录下创建图片文件 mediaFile = new File(mediaStorageDir.getPath() + File.separator + "image" + timeStamp + ".jpg"); System.out.println("图片存放地址: " + mediaFile.getAbsolutePath()); return mediaFile; } /** * * @param requestCode 可以根据这个requestCode知道是哪个东西(例如拍照或者录像)请求数据 * @param resultCode 请求是否成功 * @param data 返回的数据 */ @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); Log.d(LOG_TAG, "onActivityResult: requestCode: " + requestCode + " ,resultCode: " + resultCode); if (CAPTURE_IMAGE_ACTIVITY_REQUEST_CODE == requestCode) { if (resultCode == Activity.RESULT_OK) { //检测sd卡状态 String sdStatus = Environment.getExternalStorageState(); if (!sdStatus.equals(Environment.MEDIA_MOUNTED)) { System.out.println("SD卡可用!"); return; } //data = null代表数据已经存储到指定的位置,如果data不为空即代表你没有指定存储目录,而是存在了默认的位置 if (data == null) { Log.d(LOG_TAG, "data is null , file saved on target position"); int width = imageView.getWidth(); int height = imageView.getHeight(); //BitmapFactory.Optins是BitmapFactory的内部类,用于配置图片的缩放设置 //因为每个android app只有16mb内存的限制(不一定的,有的手机更大), // 图片太大,用java处理就会破了16mb BitmapFactory.Options factoryOptions = new BitmapFactory.Options(); //inJustDecodeBounds设置成true之后通过decodeFile只会得出图片的宽高避免内存溢出 factoryOptions.inJustDecodeBounds = true; BitmapFactory.decodeFile(fileUri.getPath(), factoryOptions); //获取图片的原始宽高 int imageWidth = factoryOptions.outWidth; int imageHeight = factoryOptions.outHeight; //计算缩放比例 int scaleFactory = Math.min(imageHeight / height, imageWidth / width); //设置inJustDecodeBounds为false,获取缩放后的图片 factoryOptions.inJustDecodeBounds = false; //设置缩放比例 factoryOptions.inSampleSize = scaleFactory; // 如果 inPurgeable 设为True的话表示使用BitmapFactory创建的Bitmap //用于存储Pixel的内存空间在系统内存不足时可以被回收 factoryOptions.inPurgeable = true; Bitmap bitmap = BitmapFactory.decodeFile(fileUri.getPath(), factoryOptions); imageView.setImageBitmap(bitmap); } } } } }/** * 文件上传类 */class FileImageUpload{ private static final int TIME_OUT = 10 * 1000000; private static final String CHARSET = "UTF-8"; public static final String SUCCESS = "1"; public static final String FAILURE = "2"; private static final String uploadUrl = "http://192.168.2.101:8080/Test/server/upload"; public static String uploadFile(String file){ String BOUNDARY = UUID.randomUUID().toString();//边界标示 随机生成 String PREFIX = "--"; String LINE_END = "\r\n"; String CONTENT_TYPE = "multipart/form-data"; try{ URL url = new URL(uploadUrl); 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");//设置setDoOutput为true默认把方法设成POST conn.setRequestProperty("Charset", CHARSET); conn.setRequestProperty("connection", "keep-alive"); conn.setRequestProperty("Content-type",CONTENT_TYPE + ";boundary=" + BOUNDARY); //上面的请求设置必须正确 if(file != null){ //如果file不为空,把文件包装并上传 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.jpg */ sb.append("Content-Disposition: form-data; name=\"upload\";filename=\"" + file + "\"" + 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(SecondActivity.mediaFile); 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(); System.out.println("response code: " + res); if(res == 200){ return SUCCESS; } } } catch(MalformedURLException e){ e.printStackTrace(); } catch(Exception e){ e.printStackTrace(); System.out.println("上传失败"); } return FAILURE; }}
下面是服务器端的程序
<pre name="code" class="java">import java.util.*;import java.io.*;import javax.management.loading.PrivateClassLoader;import javax.servlet.ServletConfig;import javax.servlet.ServletException;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import org.apache.tomcat.util.*;import org.apache.tomcat.util.http.fileupload.*;import org.apache.tomcat.util.http.fileupload.disk.DiskFileItemFactory;import org.apache.tomcat.util.http.fileupload.servlet.ServletFileUpload;import org.apache.tomcat.util.http.fileupload.servlet.ServletRequestContext;import org.omg.CORBA.PRIVATE_MEMBER;public class UploadServlet extends HttpServlet {private String filePath;private String tempFilePath;@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException ,IOException {doPost(request, response);};@Overrideprotected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//临时目录,这里必须手动在你的webapps/服务器目录/手动创建一个temp文件夹tempFilePath = request.getSession().getServletContext().getRealPath("/temp");response.setContentType("text/plain");System.out.println(tempFilePath);try{//创建一个基于硬盘的FileItem工厂,这个工厂可以讲request里面的每个项目转换成DiskFileItem(FileItem接口的实现)DiskFileItemFactory factory = new DiskFileItemFactory();//设置项硬盘写数据时所用的缓冲区大小,单位为字节factory.setSizeThreshold(4 * 1024);//设置临时目录factory.setRepository(new File(tempFilePath));//创建一个文件上传处理器ServletFileUpload upload = new ServletFileUpload(factory);//设置允许上传的文件的最大尺寸,此处为10Mupload.setSizeMax(10 * 1024 * 1024);ServletRequestContext requestContext = new ServletRequestContext(request);List<FileItem> items = upload.parseRequest(requestContext);Iterator iter = items.iterator();while(iter.hasNext()){FileItem item = (FileItem)iter.next();String fileName = item.getName();int index = fileName.lastIndexOf("/");//获取文件名fileName = fileName.substring(index + 1, fileName.length());//下面的代码必须注意,要保存的目录必须用StringBuffer连接起来,否则系统会找不到这个文件StringBuffer sb = new StringBuffer();sb.append("/upload/");sb.append(fileName);filePath = request.getSession().getServletContext().getRealPath(sb.toString());if(item.isFormField()){processFormField(item);}else{processUploadFile(item);}}}catch(Exception e){System.out.println("can not find the file");e.printStackTrace();}}private void processFormField(FileItem item) throws Exception{//获取表单名String name = item.getFieldName();String value = item.getString("UTF-8");System.out.println("Field name: " + name);System.out.println("Value: " + value);}private void processUploadFile(FileItem item) throws Exception{File uploadedFile = new File(filePath);System.out.println(uploadedFile);item.write(uploadedFile);}}
0 2
- Android上传图片到本地服务器
- struts2 上传本地图片到服务器
- JAVA,本地上传图片到服务器
- Spring mvc上传图片到本地服务器
- html5 本地裁剪图片上传到服务器
- android 上传图片到服务器
- Android: 上传图片到服务器
- Android上传图片到服务器
- Android 上传图片到服务器
- android上传图片到服务器
- Android上传图片到服务器
- android上传图片到服务器
- Android 上传图片到服务器
- android 上传图片到服务器
- android 图片上传到服务器
- Android 上传图片到服务器
- Android 上传图片到服务器
- Android 上传图片到服务器
- cf 567 c
- swift学习笔记一: 调用Objective-C代码
- Android编码规范
- Linux学习笔记----rpm命令管理-----校验和文件提取
- C源码@数据结构与算法->AVL树
- Android上传图片到本地服务器
- SAP FICO期初开账存货导入尾差
- 常量指针和指针常量的区别详解
- php xdebug工具的使用语法
- noip1999 Cantor表 (找规律)
- 单例模式常用方法
- 网站内部优化的六个基本要点
- 导入excel数据,导出数据到excel
- Map, Map and flatMap in Scala