Android上传图片到PHP服务器并且支持浏览器上传文件(word、图片、音乐等)
暑假已经过了一半了,这才完成计划当中的第二个任务。虽然进度是慢了点。但也算是暑假的收获吧。下面我就把我学习当中的收获记录在此。
还是跟以往一样,先上图片。
操作的步骤:打开程序----》选择上传的照片-----》点击返回键------》显示没有选择上传图片的toast------》点击上传的图片-----》打印图片的存储的物理路径----》询问是否确认上传选择的图片-----》确认则显示上传成功----》取消则退出








php代码:
<?php
//上传文件进行简单错误过滤
if($_FILES['userfile']['error']>0){
exit('上传文件有错误');
}
//定义存放文件的真实路径(需要手动创建)
$path = "D:/xampp/htdocs/xampp/upload/";
//定义存放上传文件的真实路径名
$name = $_FILES['userfile']['name']; //将文件的名字的字符编码从utf-8转换成gb2312
$name = iconv ("UTF-8","GB2312",$name);
//将上传文件移动到指定目录文件中
$path = $path.$name;
if(move_uploaded_file($_FILES['userfile']['tmp_name'],$path)){
echo "文件上传成功!";
// print_r($_FILES); }else{
echo "文件上传失败!";
$_FILES['userfile']['tmp_name'] ;
print_r($_FILES); }
?>
android代码:
MainActivity.java
package com.itcast.upload; import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
import java.util.HashMap;
import java.util.Map; import android.net.Uri;
import android.os.Bundle;
import android.provider.MediaStore;
import android.app.Activity;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.content.Intent;
import android.database.Cursor;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.Toast; public class MainActivity extends Activity { private Button btn_select;
private static final int FLAGE_LOAD_IMAGE = 1;
public static String pathName;
private UserService userService = new UserServiceImpl(); @Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == FLAGE_LOAD_IMAGE) {
if (data == null) {
Toast.makeText(this, "你没有选择任何图片", 1).show();
}else{
Uri uri = data.getData();
if (uri == null) {
Toast.makeText(this, "你没有选择任何图片", 1).show();
}else{
String path = null;
String[] pojo = {MediaStore.Images.Media.DATA};
Cursor cursor = getContentResolver().query(uri, pojo, null, null, null);
if (cursor != null) {
int columnIndex = cursor.getColumnIndexOrThrow(pojo[0]);
cursor.moveToFirst();
path = cursor.getString(columnIndex);
cursor.close();
}
if (path != null) {
Toast.makeText(this, "图片的物理路径"+ path, 0).show();
pathName = path;
new AlertDialog.Builder(this).setTitle("提示")
.setMessage("你要上传选择的图片吗?")
.setPositiveButton("确定", new DialogInterface.OnClickListener() { @Override
public void onClick(DialogInterface dialog, int which) {
doUpload(); }
}).setNegativeButton("取消", new DialogInterface.OnClickListener() { @Override
public void onClick(DialogInterface dialog, int which) {
// TODO Auto-generated method stub }
}).create().show();
}else{
Toast.makeText(this, "未能获得图片的物理路径", 0).show();
}
}
}
}
}
private void doUpload(){
new Thread(new Runnable(){
public void run(){
try{
//文件二进制数据
InputStream in = new FileInputStream(new File(pathName));
//普通字符串数据
Map<String,String> data = new HashMap<String,String>();
final String result = userService.userUpload(in, data);
runOnUiThread(new Runnable(){
public void run(){
Toast.makeText(MainActivity.this, result, 1).show();
}
}); }catch(Exception e){
e.printStackTrace();
runOnUiThread(new Runnable(){
public void run(){
Toast.makeText(MainActivity.this, "上传错误", 1).show();
}
});
}
}
}).start();
} protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
this.btn_select = (Button) this.findViewById(R.id.btn_select);
this.btn_select.setOnClickListener(new OnClickListener() { @Override
public void onClick(View v) {
Intent intent = new Intent(
Intent.ACTION_PICK,
android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
startActivityForResult(intent, FLAGE_LOAD_IMAGE);
}
});
} }
UserService.java 一个接口代码为:
package com.itcast.upload; import java.io.InputStream;
import java.util.Map; public interface UserService {
public String userUpload(InputStream in,Map<String,String> data)throws Exception;
}
UserServiceImpl.java 实现UserService接口
代码为:
package com.itcast.upload; import java.io.InputStream;
import java.nio.charset.Charset;
import java.util.Map;
import java.util.Random; import org.apache.http.HttpResponse;
import org.apache.http.HttpStatus;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.mime.MultipartEntity;
import org.apache.http.entity.mime.content.InputStreamBody;
import org.apache.http.entity.mime.content.StringBody;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.protocol.HTTP;
import org.apache.http.util.EntityUtils; class UserServiceImpl implements UserService { @Override
public String userUpload(InputStream in, Map<String, String> data)
throws Exception {
HttpClient client = new DefaultHttpClient();
HttpPost post = new HttpPost("http://192.168.1.103/xampp/upData.php");
//要把数据封装到post里面去
/*Httpmine*/
MultipartEntity entity = new MultipartEntity();
//二进制的流文件数据对象
entity.addPart("userfile",new InputStreamBody(in, "multipart/form-data",MainActivity.pathName));
//数据放到post
post.setEntity(entity);
HttpResponse response = client.execute(post);
int statusCode = response.getStatusLine().getStatusCode();
System.out.println(statusCode);
if (statusCode != HttpStatus.SC_OK) { }
String result = EntityUtils.toString(response.getEntity(), HTTP.UTF_8);
return result;
} }
需要添加的权限有:
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.INTERNET"/>
至此,android端的代码书写完毕。
下面是浏览器端的代码:
upload.html
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>无标题文档</title>
<script type="text/javascript">
//通过页面加载事件实现上传文件时显示进度条
function sub(){
//实现Ajax对象
var obj = new XMLHttpRequest();
//接收响应的信息
obj.onreadystatechange = function(){
if(obj.readyState == 4 && obj.status == 200){
document.getElementById('con').innerHTML = obj.responseText;
}
}
//onprogress 属性通过主浏览器的“事件对象evt”感知当前附件上传情况
obj.upload.onprogress = function(evt){
//上传附件大小的百分比
//其中evt.total 表示附件的总大小 evt.loaded表示已经上传附件大小
var per = Math.floor((evt.loaded/evt.total)*100)+"%";
//当前上传文件时,显示进度条
document.getElementById('parent').style.display = 'block';
//通过上传百分比设置进度条样式的宽度
document.getElementById('son').style.width = per;
//在进度条上显示上传的进度值
document.getElementById('son').innerHTML = per;
}
//通过FormData 收集零散的上传文件信息
var fm = document.getElementById("userfile3").files[0];
var fd = new FormData();
fd.append('userfile',fm); obj.open('post','upData.php');
obj.send(fd);
}
</script>
<style type="text/css">
#parent {
width:200px;
height:20px;
border:2px solid gray;
background:lightgray;
display:none;
}
#son{
width:0;
height:100%;
background:lightgreen;
text-align:center;
}
</style>
</head> <body>
<h2> Ajax实现进度条上传文件</h2>
<div id="parent">
<div id="son"></div>
</div>
<p id="con"></p>
<input type="file" name="userfile" id="userfile3" />
<br /><br />
<input type="button" onclick="sub()" value="文件上传"/>
</body>
</html>
遇到的问题:

解决的办法是修改android端的代码:


解决的办法是:

Android上传图片到PHP服务器并且支持浏览器上传文件(word、图片、音乐等)的更多相关文章
- https 协议下服务器根据网络地址下载上传文件问题
		
https 协议下服务器根据网络地址下载上传文件遇到(PKIX:unable to find valid certification path to requested target 的问题) 使用h ...
 - Http请求之基于HttpUrlConnection,支持Header,Body传值,支持Multipart上传文件:
		
Http请求之基于HttpUrlConnection,支持Header,Body传值,支持Multipart上传文件: public static String post(String actionU ...
 - asp dotnet core 支持客户端上传文件
		
本文告诉大家如何在 asp dotnet core 支持客户端上传文件 新建一个 asp dotnet core 程序,创建一个新的类,用于给客户端上传文件的信息 public class Kanaj ...
 - 使用input:file控件在微信内置浏览器上传文件返回未显示选择的文件
		
使用input:file控件在微信内置浏览器上传文件返回未显示选择的文件 原来的写法: <input type="file" accept="image/x-png ...
 - Android 上传文件,图片。以及服务器端接收相关。
		
前面一篇文章写了实现照相功能的一个例子,其实那个实现效果是个略缩图.要查看全图就要先指定照片的存放路径.以后我会修改那个文章.今天先说下图片,文件等上传的实现.接着拿照片说事,光照完了不行还得往服务器 ...
 - Android学习笔记_13_网络通信之多个上传文件
		
一.获取HTTP协议: 建立一个Web项目,建立一个如下所示的jsp界面,用IE捕获表单提交信息. <%@ page language="java" contentType= ...
 - IE浏览器上传文件时本地路径变成”C:\fakepath\”的问题【转】
		
转自:http://www.iefans.net/ie-shangchuan-bendi-lujing-fakepath/ 在使用<input id="file_upl" t ...
 - IE浏览器上传文件时本地路径变成”C:\fakepath\”的问题
		
在使用<input id="file_upl" type="file" />控件上传文件时,有时会需要获取文件本地路径展示给客户,这时可以通过这样的 ...
 - 【TFS 2017】使用浏览器上传文件(TFVC)或者编辑代码,错误提示TF14098,需要对文件有PendChange 权限
		
从TFS 2015开始,微软在TFS系统中增加了一个非常吸引开发人员的功能,"快速代码编辑器" (Quick Code Editor).使用这个功能,你可以在任何安装了浏览器的设备 ...
 
随机推荐
- ”Connection reset by peer“引发的思考
			
闲来无事,把之前写的一个游戏服务器框架(<一个java页游服务器框架>),部署到阿里云服务器上,测试运行了下,结果看到后台log中打印出了“Connection reset by peer ...
 - 采用Kettle分页处理大数据量抽取任务
			
作者:Grey 原文地址: http://greyzeng.com/2016/10/31/big-data-etl/ 需求: 将Oracle数据库中某张表历史数据导入MySQL的一张表里面. 源表(O ...
 - rtf格式的一些说明,转载的
			
RTF是Rich TextFormat的缩写,意即多文本格式.这是一种类似DOC格式(Word文档)的文件,有很好的兼容性,使用Windows"附件"中的"写字板&quo ...
 - DirectX.Capture Namespace
			
DirectX.Capture Class Library DirectX.Capture Namespace The DirectX.Capture namespace contains cla ...
 - IOS 字典快速转换为Model 模型
			
一般情况下IOS得局部页面加载的过程是,创建一个Model然后,将Nib文件与Model进行关联,然后能够快速的获取到Nib文件上的控件实例.操作生成页面. 但是原生的内容是没有直接通过Json获取M ...
 - 如何使用C#创建WebService
			
使用C#创建WebService,服务端的webservice是必须,中间的soap,Xml我们不用去关心.下面是使用C#创建WebService的简单介绍. AD:51CTO技术沙龙 | 赋予APP ...
 - UML - 类图
			
在UML类图中,有以下几种常见关系: 泛化 - Generalization "is-a",继承关系,表示一般与特殊的关系: 子类(接口)特化父类(接口)的所有特征和行为,是对象之 ...
 - C#控制台程序的参数解析类库 CommandLine简单使用说明
			
前言 C#开发的控制台程序,默认接收string[] args参数.如果有多个参数需要输入时,可以按照顺序依次输入:但如果有些参数不是必选的,或者有些参数中间需要有空格比如时间“2016-05-18 ...
 - ASP.NET入门教程:事件句柄
			
事件句柄(event handler)是一种针对给定事件来执行代码的子例程. ASP.NET - 事件句柄 请看下面的代码: <% lbl1.Text="The date and ti ...
 - Pydev Debugger not working with breakpoints
			
I have a simple test module: print("fish")print("sticks")It runs pretty fast as ...