项目上传图片到后台,前端总是传不上去,翻阅代码,详细查看,原来是php的头和java的不同。
总体的思路是,可以拍照上传,也可以本地上传。利用onActivityResult,从返回的Intent中得到Bitmap对象。
如果是文件系统中的图片又分为content://开头和file://开头,给予判断即可。
又:java和php服务器后台传输数据时,解析不同的头,下面上代码:
public class CameraTest extends Activity {
Bitmap photo = null;
String filename="";
String picPath="";
ImageView imageview;
Button mPic,mUpload;
static String path="http://xxx.xxx.x.xx/xxxr.php";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_camera_test);
imageview=(ImageView) findViewById(R.id.imageview);
mPic=(Button) findViewById(R.id.pic);
mUpload=(Button) findViewById(R.id.upload);
mUpload.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
if(photo!=null){
String srcPath = Environment.getExternalStorageDirectory()+ "/imgs/"+filename;
new CommentAsyncTask().execute(srcPath);
}
}
});
mPic.setOnClickListener(new Onclicklistenerimpl2());
}
class CommentAsyncTask extends AsyncTask<String, Integer, String> {
@Override
protected String doInBackground(String... params) {
uploadFile(params[0]);
return "";
}
@Override
protected void onPostExecute(String result) {
//
super.onPostExecute(result);
}
}
// ///////////////////////////////上传图片/////////////////////////////////////////////////
private class Onclicklistenerimpl2 implements OnClickListener {
private String[] method = { "拍照上传", "本地上传" };
@Override
public void onClick(View v) {
dialog();
}
private void dialog() {
AlertDialog ad = new AlertDialog.Builder(CameraTest.this)
// .setIcon(R.drawable.ic_launcher)
.setItems(method, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
switch (which) {
case 0:
String state = Environment
.getExternalStorageState();
if (state.equals(Environment.MEDIA_MOUNTED)) {
Intent intent = new Intent(
"android.media.action.IMAGE_CAPTURE");
startActivityForResult(intent, 11);
} else {
Toast.makeText(CameraTest.this,
"sdcard is missing", Toast.LENGTH_LONG)
.show();
}
break;
case 1:
/***
*
* 这个是调用android内置的intent,来过滤图片文件 ,同时也可以过滤其他的
*/
Intent intent = new Intent();
intent.setType("image/*");
intent.setAction(Intent.ACTION_GET_CONTENT);
startActivityForResult(intent, 12);
break;
}
// Toast.makeText(getApplicationContext(),
// method[which], Toast.LENGTH_SHORT).show();
}
}).create();
ad.show();
}
}
private void uploadFile(String srcPath){
// MyApp ma = (MyApp) getApplicationContext();
String uploadUrl = path;
String end = "\r\n";
String twoHyphens = "--";
String boundary = "******";
try {
URL url = new URL(uploadUrl);
HttpURLConnection httpURLConnection = (HttpURLConnection) url
.openConnection();
httpURLConnection.setDoInput(true);
httpURLConnection.setDoOutput(true);
httpURLConnection.setUseCaches(false);
httpURLConnection.setRequestMethod("POST");
httpURLConnection
.setRequestProperty("Connection", "Keep-Alive");
httpURLConnection.setRequestProperty("Charset", "UTF-8");
/*this part is for java used
* httpURLConnection.setRequestProperty("Content-Type",
"multipart/form-data;boundary=" + boundary);*/
/*this part is for php used*/
httpURLConnection.setRequestProperty("enctype",
"multipart/form-data;boundary="+boundary);
DataOutputStream dos = new DataOutputStream(
httpURLConnection.getOutputStream());
/*this part is for java used
* dos.writeBytes(twoHyphens + boundary + end);
dos.writeBytes("Content-Disposition: form-data; name=\"file\"; filename=\""
+ srcPath.substring(srcPath.lastIndexOf("/") + 1)+ "\"" + end);
dos.writeBytes(end);*/
Log.i("CAMERA",srcPath);
FileInputStream fis = new FileInputStream(srcPath);
byte[] buffer = new byte[8192]; // 8k
int count = 0;
while ((count = fis.read(buffer)) != -1) {
dos.write(buffer, 0, count);
}
fis.close();
dos.writeBytes(end);
dos.writeBytes(twoHyphens + boundary + twoHyphens + end);
dos.flush();
InputStream is = httpURLConnection.getInputStream();
InputStreamReader isr = new InputStreamReader(is, "utf-8");
BufferedReader br = new BufferedReader(isr);
String result="";
int i=0;
while(i<100){
result= br.readLine();
if(result!=null&&!"".equals(result)){
Log.i("CAMERA", result);//tishi
}
i++;
}
Log.i("CAMERA", br.read()+"---br.read()----");//tishi
Looper.prepare();
Toast.makeText(CameraTest.this, result, Toast.LENGTH_LONG)
.show();
dos.close();
is.close();
} catch (Exception e) {
e.printStackTrace();
// setTitle(e.getMessage());
}
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
//receive camera message
if(11==requestCode){
Uri uri = data.getData();
if (uri != null) {
photo = BitmapFactory.decodeFile(uri.getPath());
// imageview.setImageBitmap(photo);
}
if (photo == null) {
Bundle bundle = data.getExtras();
if (bundle != null) {
photo = (Bitmap) bundle.get("data");
} else {
Toast.makeText(CameraTest.this,
"get image falure",
Toast.LENGTH_LONG).show();
return;
}
}
imageview.setImageBitmap(photo);
storeImgs(photo);
}
//receive local message
if(12==requestCode){
/**
* 当选择的图片不为空的话,在获取到图片的途径
*/
Uri uri = data.getData();
Log.i("mylog", "local uri = "+ uri);
try {
//MediaStore
String[] pojo = {MediaStore.Images.Media.DATA};
Cursor cursor = this.managedQuery(uri, pojo, null, null,null);
if(cursor!=null)
{
ContentResolver cr = this.getContentResolver();
int colunm_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
cursor.moveToFirst();
String path = cursor.getString(colunm_index);
Log.i("CAMERA",path+"-----------------------");
/***
* 这里加这样一个判断主要是为了第三方的软件选择,比如:使用第三方的文件管理器的话,你选择的文件就不一定是图片了,这样的话,我们判断文件的后缀名
* 如果是图片格式的话,那么才可以
*/
if(path.endsWith("jpg")||path.endsWith("png"))
{
picPath = path;
photo = BitmapFactory.decodeStream(cr.openInputStream(uri));
imageview.setImageBitmap(photo);
}else{
}
}else{
String fileName;
String str=uri.toString().substring(0, uri.toString().indexOf("/"));
Log.i("mylog","------"+str);
if("file:".equals(str)){
fileName = uri.toString();
fileName = uri.toString().replace("file://", "");
//替换file://
if(!fileName.startsWith("/mnt")){
//加上"/mnt"头
fileName += "/mnt";
}
imageview.setImageBitmap(BitmapManager.convertToBitmap(fileName, 300, 500));
Log.i("mylog","wrong..------"+fileName);
}
}
} catch (Exception e) {
}
storeImgs(photo);
}
}
private void storeImgs(Bitmap bitmap) {
String pictureDir = "";
FileOutputStream fos = null;
BufferedOutputStream bos = null;
ByteArrayOutputStream baos = null;
try {
baos = new ByteArrayOutputStream();
bitmap.compress(Bitmap.CompressFormat.JPEG, 100, baos);
byte[] byteArray = baos.toByteArray();
String saveDir = Environment.getExternalStorageDirectory()
+ "/imgs";
File dir = new File(saveDir);
if (!dir.exists()) {
dir.mkdir();
}
//根据系统时间创建名称
filename=Calendar.getInstance().getTimeInMillis()+".jpg";
File file = new File(saveDir, filename);
file.delete();
if (!file.exists()) {
file.createNewFile();
}
fos = new FileOutputStream(file);
bos = new BufferedOutputStream(fos);
bos.write(byteArray);
pictureDir = file.getPath();
} catch (Exception e) {
e.printStackTrace();
} finally {
if (baos != null) {
try {
baos.close();
} catch (Exception e) {
e.printStackTrace();
}
}
if (bos != null) {
try {
bos.close();
} catch (Exception e) {
e.printStackTrace();
}
}
if (fos != null) {
try {
fos.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
// ///////////////////////////////////////////////////////////////////////////////////////////
}
需要注意的就是upload方法,在这里。我注释掉的部分是java服务器的代码,需要用时,把php的代码注掉,即可使用。
分享到:
相关推荐
前一阵子整的android 上传图片到服务端,因为不善长java web 所以服务端是用.net写的,同时也写了个php版,里面包含客户端和服务端的代码,因为是抽取出来,使用时可能一些变量需要作相应修改。
本实例实现每隔5秒上传一次,通过服务器端获取手机上传过来的文件信息并做相应处理;采用Android+Struts2技术。 一、Android端实现文件上传 1)、新建一个Android项目命名为androidUpload,目录结构如下: 2)、...
在Android平台上,使用Camera进行拍照并实现图片上传到PHP服务器是一项常见的功能,广泛应用于各种应用程序,如社交网络、影像分享等。以下将详细介绍这个过程涉及的关键知识点。 首先,我们需要了解Android中的...
先前一直在做java服务器,最近要开发用到php,这其中遇到的最让人纠结的要属php、Android和iPhone三个平台加解密不一致的问题。因为手机端后台通常是用php开发的Web Service,Android和iPhone客户端调用同样的Web ...
网上很多上传到java服务器上的,找了好久,找到了上传到php的了,思路跟我当初想的差不多,就是POST过去。废话不多说,直接上图看代码。 php代码 <?php $target_path = ./upload/;//接收文件目录 $target_...
为了使Android应用能够与PHP服务器进行通信,需要在Android客户端的POST请求中添加正确的Content-Type头,通常是`multipart/form-data`,因为这是上传文件的标准格式。同时,服务器端的PHP脚本必须正确解析这个格式...
听说用PHP搭建服务器的居多,但是我们做大Android的最熟悉的还是Java了,所以下面我就开始搭建这个服务器。很简单。。。 首先我下载了一个myelipse应为我们开发android的eclipse不能创建web project 要不然你去下载...
1. 例子代码有两部分:androidJson是andoird的工程,inxdex.php是php服务器json数据产生部分代码。 2. 服务器端提供http(get)获取方式获取json数据的api例子,是用php写的。 4. android的apk给你说完成http数据...
SQLite是一款广泛应用于移动开发领域的开源嵌入式数据库,尤其在Java Android平台上。SQLite具有轻量级、绿色软件、单一文件等特点,使得它成为许多小型应用和嵌入式系统的首选数据库解决方案。 SQLite的主要特性:...
总的来说,Android上传图片到PHP服务器的过程主要包括:在Android端选择图片、读取并编码图片、设置HTTP请求参数、发送POST请求;在PHP端,创建接收文件的脚本,处理上传的文件并返回响应。在整个过程中,需要注意...
使用了java httppost 上传FileEntity实体文件,服务器端用php接收客户端的上传文件。
在Android开发中,与服务器进行数据交互是常见的需求,这里我们关注的是Android应用程序与PHP服务器之间的通信。Android作为客户端,通常使用HTTP或HTTPS协议来发送请求到PHP服务器,获取或发送数据。在这个"我的这...
资源要1分,因为我也没分 代码非常简陋,希望能帮到你 要注意,ip一定要公网或局域网,不要localhost,我就吃过亏,至于为什么,自己想想 ...Java是测试程序,测试程序通过一般android客户端都会通过
描述中提到“注意对应的服务端必须有服务器代码接受你上传的文件”,这意味着客户端(Android应用)只是上传流程的一半,服务器端也需要相应的接收和处理逻辑。这可能涉及到PHP、Node.js、Python或其他后端语言,取...
ftp4j是一个FTP客户端Java类库,实现了FTP客户端应具有的大部分功能文件(包括上传和下 载),浏览远程FTP服务器上的目录和文件,创建、删除、重命,移动远程目录和文件。ftp4j提供多种方式连接到远程FTP服务器包括...
2. **Java**:Java是一种面向对象的、跨平台的编程语言,被广泛应用于企业级应用、移动应用(尤其是Android)和大型分布式系统。Java以其“一次编写,到处运行”的特性著名,且具有强大的并发处理能力,适合构建高...
Android 上传多张图片的实例代码(RxJava 异步分发) 知识点一:Android 上传多张图片的需求 在 Android 开发中,上传多张图片是非常常见的需求。...我们可以使用服务器端语言例如 Java、PHP 等来处理图片。
本文主要探讨了Android移动终端如何利用JSON(JavaScript Object Notation)与PHP服务器进行数据通信,并结合MySQL数据库实现数据存储和检索。 1. JSON简介 JSON是一种轻量级的数据交换格式,它采用完全独立于语言...