///////////2016/03/14///////////
/////////by xbw/////////////////
/////////环境 eclipse php//
第一种,‘
一个类FileUtil
package com.example.image_head; import java.io.ByteArrayOutputStream; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.text.SimpleDateFormat; import java.util.Date; import java.util.Locale; import android.content.Context; import android.graphics.Bitmap; import android.graphics.Bitmap.CompressFormat; import android.os.Environment; public class FileUtil { public static String saveFile(Context c, String fileName, Bitmap bitmap) { return saveFile(c, "", fileName, bitmap); } public static String saveFile(Context c, String filePath, String fileName, Bitmap bitmap) { byte[] bytes = bitmapToBytes(bitmap); return saveFile(c, filePath, fileName, bytes); } public static byte[] bitmapToBytes(Bitmap bm) { ByteArrayOutputStream baos = new ByteArrayOutputStream(); bm.compress(CompressFormat.JPEG, 100, baos); return baos.toByteArray(); } public static String saveFile(Context c, String filePath, String fileName, byte[] bytes) { String fileFullName = ""; FileOutputStream fos = null; String dateFolder = new SimpleDateFormat("yyyyMMdd", Locale.CHINA) .format(new Date()); try { String suffix = ""; if (filePath == null || filePath.trim().length() == 0) { filePath = Environment.getExternalStorageDirectory() + "/JiaXT/" + dateFolder + "/"; } File file = new File(filePath); if (!file.exists()) { file.mkdirs(); } File fullFile = new File(filePath, fileName + suffix); fileFullName = fullFile.getPath(); fos = new FileOutputStream(new File(filePath, fileName + suffix)); fos.write(bytes); } catch (Exception e) { fileFullName = ""; } finally { if (fos != null) { try { fos.close(); } catch (IOException e) { fileFullName = ""; } } } return fileFullName; } }
第二个类 NetUtil
package com.example.image_head; import java.io.ByteArrayOutputStream; import java.io.DataOutputStream; import java.io.File; import java.io.FileInputStream; import java.io.InputStream; import java.net.URLEncoder; import java.util.Iterator; import java.util.Map; import java.util.Set; public class NetUtil { // 一般来说用一个生成一个UUID的话,会可靠很多,这里就不考虑这个了 // 而且一般来说上传文件最好用BASE64进行编码,你只要用BASE64不用的符号就可以保证不冲突了。 // 尤其是上传二进制文件时,其中很可能有\r、\n之类的控制字符,有时还可能出现最高位被错误处理的问题,所以必须进行编码。 public static final String BOUNDARY = "--my_boundary--"; /** * 普通字符串数据 * @param textParams * @param ds * @throws Exception */ public static void writeStringParams(Map<String, String> textParams, DataOutputStream ds) throws Exception { Set<String> keySet = textParams.keySet(); for (Iterator<String> it = keySet.iterator(); it.hasNext();) { String name = it.next(); String value = textParams.get(name); ds.writeBytes("--" + BOUNDARY + "\r\n"); ds.writeBytes("Content-Disposition: form-data; name=\"" + name + "\"\r\n"); ds.writeBytes("\r\n"); value = value + "\r\n"; ds.write(value.getBytes()); } } /** * 文件数据 * @param fileparams * @param ds * @throws Exception */ public static void writeFileParams(Map<String, File> fileparams, DataOutputStream ds) throws Exception { Set<String> keySet = fileparams.keySet(); for (Iterator<String> it = keySet.iterator(); it.hasNext();) { String name = it.next(); File value = fileparams.get(name); ds.writeBytes("--" + BOUNDARY + "\r\n"); //uploadedfile与服务器端内容匹配 ds.writeBytes("Content-Disposition: form-data; name=\"uploadedfile\"; filename=\"" + URLEncoder.encode(value.getName(), "UTF-8") + "\"\r\n"); ds.writeBytes("Content-Type:application/octet-stream \r\n"); ds.writeBytes("\r\n"); ds.write(getBytes(value)); ds.writeBytes("\r\n"); } } // 把文件转换成字节数组 private static byte[] getBytes(File f) throws Exception { FileInputStream in = new FileInputStream(f); ByteArrayOutputStream out = new ByteArrayOutputStream(); byte[] b = new byte[1024]; int n; while ((n = in.read(b)) != -1) { out.write(b, 0, n); } in.close(); return out.toByteArray(); } /** * 添加结尾数据 * @param ds * @throws Exception */ public static void paramsEnd(DataOutputStream ds) throws Exception { ds.writeBytes("--" + BOUNDARY + "--" + "\r\n"); ds.writeBytes("\r\n"); } public static String readString(InputStream is) { return new String(readBytes(is)); } public static byte[] readBytes(InputStream is) { try { byte[] buffer = new byte[1024]; int len = -1; ByteArrayOutputStream baos = new ByteArrayOutputStream(); while ((len = is.read(buffer)) != -1) { baos.write(buffer, 0, len); } baos.close(); return baos.toByteArray(); } catch (Exception e) { e.printStackTrace(); } return null; } }
方法,在button的点击事件中添加线程
new Thread(uploadImageRunnable).start();
Runnable uploadImageRunnable = new Runnable() { @Override public void run() { if(TextUtils.isEmpty(imgUrl)){//php服务器端url Toast.makeText(getActivity(), "还没有设置上传服务器的路径!", Toast.LENGTH_SHORT).show(); return; } Map<String, String> textParams = new HashMap<String, String>(); Map<String, File> fileparams = new HashMap<String, File>(); try { // 创建一个URL对象 URL url = new URL(imgUrl); textParams = new HashMap<String, String>(); fileparams = new HashMap<String, File>(); // 要上传的图片文件 File file = new File(urlpath);//本地图片路径 fileparams.put("image", file); // 利用HttpURLConnection对象从网络中获取网页数据 HttpURLConnection conn = (HttpURLConnection) url.openConnection(); // 设置连接超时(记得设置连接超时,如果网络不好,Android系统在超过默认时间会收回资源中断操作) conn.setConnectTimeout(5000); // 设置允许输出(发送POST请求必须设置允许输出) conn.setDoOutput(true); // 设置使用POST的方式发送 conn.setRequestMethod("POST"); // 设置不使用缓存(容易出现问题) conn.setUseCaches(false); conn.setRequestProperty("Charset", "UTF-8");//设置编码 // 在开始用HttpURLConnection对象的setRequestProperty()设置,就是生成HTML文件头 conn.setRequestProperty("ser-Agent", "Fiddler"); // 设置contentType conn.setRequestProperty("Content-Type", "multipart/form-data; boundary=" + NetUtil.BOUNDARY); OutputStream os = conn.getOutputStream(); DataOutputStream ds = new DataOutputStream(os); NetUtil.writeStringParams(textParams, ds); NetUtil.writeFileParams(fileparams, ds); NetUtil.paramsEnd(ds); // 对文件流操作完,要记得及时关闭 os.close(); // 服务器返回的响应吗 int code = conn.getResponseCode(); // 从Internet获取网页,发送请求,将网页以流的形式读回来 // 对响应码进行判断 if (code == 200) {// 返回的响应码200,是成功 // 得到网络返回的输入流 InputStream is = conn.getInputStream(); resultStr = NetUtil.readString(is); } else { Toast.makeText(getActivity(), "请求URL失败!", Toast.LENGTH_SHORT).show(); } } catch (Exception e) { e.printStackTrace(); } handler.sendEmptyMessage(0);// 执行耗时的方法之后发送消给handler } };
Handler handler = new Handler(new Handler.Callback() { @Override public boolean handleMessage(Message msg) { switch (msg.what) { case 0: //dialogs.dismiss(); try { // 返回数据示例,根据需求和后台数据灵活处理 JSONObject jsonObject = new JSONObject(resultStr); String imageUrl = jsonObject.optString("imageUrl"); Toast.makeText(getActivity(), imageUrl, Toast.LENGTH_SHORT).show(); }else{ Toast.makeText(getActivity(), jsonObject.optString("statusMessage"), Toast.LENGTH_SHORT).show(); } } catch (JSONException e) { e.printStackTrace(); } break; default: break; } return false; } });
这样就好了
第二种。
在button监听事件中添加
new Task().execute();
class Task extends AsyncTask<String, Integer, Integer> { @Override protected Integer doInBackground(String... strings) { Integer result = -1; try { result = UpFile.post(config_a.uploadUrl, new File("/storage/extSdCard/b.png"));//本地图片路径 } catch (IOException e) { e.printStackTrace(); } return result; } @Override protected void onPostExecute(Integer result) { Toast.makeText(getActivity(), "" + result, Toast.LENGTH_LONG).show(); } }
package com.example.image_head; import java.io.BufferedReader; import java.io.DataOutputStream; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.net.HttpURLConnection; import java.net.URL; import java.util.UUID; import com.example.configs.config_a; import android.widget.Toast; public class Upload_image { public static class UpFile { public static int post(String actionUrl, File file) throws IOException { //产生随机分隔内容 String BOUNDARY = UUID.randomUUID().toString(); String PREFIX = "--"; String LINEND = "\r\n"; String MULTIPART_FROM_DATA = "multipart/form-data"; String CHARSET = "UTF-8"; URL url = new URL(actionUrl); HttpURLConnection conn = (HttpURLConnection) url.openConnection(); //设置超时时间单位是毫秒 conn.setReadTimeout(5 * 1000); //设置允许输入 conn.setDoInput(true); //设置允许输出 conn.setDoOutput(true); //不允许使用缓存 conn.setUseCaches(false); //设置请求的方法为Post conn.setRequestMethod("POST"); //设置维持长连接 conn.setRequestProperty("Connection", "keep-alive"); //设置字符集为UTF-8 conn.setRequestProperty("Charset", CHARSET); //设置文件的类型 conn.setRequestProperty("Content-type", MULTIPART_FROM_DATA + "; boundary=" + BOUNDARY); DataOutputStream outStream = new DataOutputStream(conn.getOutputStream()); //发送文件数据 if (file != null) { StringBuilder sb = new StringBuilder(); sb.append(PREFIX); sb.append(BOUNDARY); sb.append(LINEND); //uploadedfile与服务器端内容匹配 sb.append("Content-Disposition: form-data; name=\"uploadedfile\"; filename=\"" + file.getName() + "\"" + LINEND); // sb.append("Content-Type: image/png" + LINEND); sb.append(LINEND); //写入输出流中 outStream.write(sb.toString().getBytes()); //将文件读入输入流中 InputStream is = new FileInputStream(file); byte[] buffer = new byte[1024]; int len = -1; //写入输出流中 while ((len = is.read(buffer)) != -1) { outStream.write(buffer, 0, len); } is.close(); //添加换行标识 outStream.write(LINEND.getBytes()); } byte[] endData = (PREFIX + BOUNDARY + PREFIX + LINEND).getBytes(); outStream.write(endData); //发送数据 outStream.flush(); //获取响应码 上传成功返回的是200 int res = conn.getResponseCode(); return res; } } }