最近试验android拍照上传的功能,基本顺利。
试验条件,
客户端,android2.2
服务器端,linux, nginx php 5.2
android 代码如下:
PHP代码如下:
<?php ///如果有上传文件则接收 if($_FILES){ $target_path = $target_path . basename( $_FILES['file1']['name']); try{ if(move_uploaded_file($_FILES['file1']['tmp_name'], $target_path)) { echo "The file ". basename( $_FILES['file1']['name']). " has been uploaded"; } } catch( Exception $e ) { echo $e->getMessage(); } } else ///如果不是上传文件则列出图片 { file_list("."); } function file_list($path){ $im_type=array('bmp','jpg','jpeg','png','gif'); if ($handle = opendir($path)) { while (false !== ($file = readdir($handle))) { if ($file != "." && $file != "..") { if (is_dir($path."/".$file)) { file_list($path."/".$file); } else { if(strpos($file,'.png',1)||strpos($file,'.jpg',1)||strpos($file,'.ico',1)||strpos($file,'.gif',1)) { echo ' <img height=\'100\' src="'.$path.'/'.$file.'" />'; } } } } } } ?>
Android 代码:
package com.app.model; import java.io.DataOutputStream; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; import java.net.HttpURLConnection; import java.net.URL; import android.app.Activity; import android.content.Intent; import android.os.Bundle; import android.widget.Toast; public class SubmitPhoto extends Activity { /* 变量声明 * newName:上传后在服务器上的文件名称 * uploadFile:要上传的文件路径 * actionUrl:服务器对应的程序路径 */ private String newName=""; private String uploadFile=""; private String actionUrl="http://dev.feiren.com/uploads/android/upload.php"; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); Intent intent = this.getIntent(); Bundle bundle = intent.getExtras(); newName = bundle.getString("fileName"); uploadFile=newName; try { String ok=post(actionUrl,newName); Toast.makeText(this, "OK!",Toast.LENGTH_LONG).show(); finish(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } /* 上传文件到Server的方法*/ /** * @param actionUrl * @param params * @param files * @return * @throws IOException */ public static String post(String actionUrl,String FileName) throws IOException { String BOUNDARY = java.util.UUID.randomUUID().toString(); String PREFIX = "--" , LINEND = "\r\n"; String MULTIPART_FROM_DATA = "multipart/form-data"; String CHARSET = "UTF-8"; URL uri = new URL(actionUrl); HttpURLConnection conn = (HttpURLConnection) uri.openConnection(); conn.setReadTimeout(5 * 1000); // 缓存的最长时间 conn.setDoInput(true);// 允许输入 conn.setDoOutput(true);// 允许输出 conn.setUseCaches(false); // 不允许使用缓存 conn.setRequestMethod("POST"); conn.setRequestProperty("connection", "keep-alive"); conn.setRequestProperty("Charsert", "UTF-8"); conn.setRequestProperty("Content-Type", MULTIPART_FROM_DATA + ";boundary=" + BOUNDARY); DataOutputStream outStream = new DataOutputStream(conn.getOutputStream()); // 发送文件数据 if(FileName!=""){ StringBuilder sb1 = new StringBuilder(); sb1.append(PREFIX); sb1.append(BOUNDARY); sb1.append(LINEND); sb1.append("Content-Disposition: form-data; name=\"file1\"; filename=\""+FileName+"\""+LINEND); sb1.append("Content-Type: application/octet-stream; charset="+CHARSET+LINEND); sb1.append(LINEND); outStream.write(sb1.toString().getBytes()); InputStream is = new FileInputStream(FileName); byte[] buffer = new byte[1024]; int len = 0; while ((len = is.read(buffer)) != -1) { outStream.write(buffer, 0, len); } is.close(); outStream.write(LINEND.getBytes()); } //请求结束标志 byte[] end_data = (PREFIX + BOUNDARY + PREFIX + LINEND).getBytes(); outStream.write(end_data); outStream.flush(); //得到响应码 int res = conn.getResponseCode(); InputStream in = null; if (res == 200) { in = conn.getInputStream(); int ch; StringBuilder sb2 = new StringBuilder(); while ((ch = in.read()) != -1) { sb2.append((char) ch); } } return in == null ? null : in.toString(); } }
以上代码已经试验成功。这个代码可以实现很多有意思的应用,比如你在户外拍照,刚拍下来,你所有的朋友马上都可以在你的微薄或者空间里看到。
文章评论