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).使用这个功能,你可以在任何安装了浏览器的设备 ...
随机推荐
- nagios的nrpe的check_command配置优化
问题处理了两个小时,MMD,各种问题: 先是出现了check_load的时候说参数错误. 然后我就希望 在nagios客户端获取到命令日志 在这篇:NREP将日志放入message中 的引导下终于解决 ...
- HashSet 与TreeSet和LinkedHashSet的区别
Set接口 Set不允许包含相同的元素,如果试图把两个相同元素加入同一个集合中,add方法返回false. Set判断两个对象相同不是使用==运算符,而是根据equals方法.也就 ...
- [转]俞敏洪:我和马云就差了8个字... [来自: news.mbalib.com]
我和马云差了 8 个字:越败越战,愈挫愈勇. 马云,我真的非常的佩服他,首先佩服他的是他跟我有同样的经历,我考了 3 年才考上了大学:他也是考了 3 年.我比他还要幸运一点,我考上的是北大的本科,马云 ...
- Entity Framework 实体框架的形成之旅--Code First模式中使用 Fluent API 配置(6)
在前面的随笔<Entity Framework 实体框架的形成之旅--Code First的框架设计(5)>里介绍了基于Code First模式的实体框架的经验,这种方式自动处理出来的模式 ...
- 使用jquery的append(content)方法的注意事项
append(content)函数:向每个匹配的元素内部追加内容. 如以下示例: 向所有段落中追加一些HTML标记. HTML 代码: <p>I would like to say: &l ...
- 数据库中char, varchar, nvarchar的差异
char char是定长的,也就是当你输入的字符小于你指定的数目时,char(8),你输入的字符小于8时,它会再后面补空值.当你输入的字符大于指定的数时,它会截取超出的字符. nvarc ...
- 类UNIX操作系统概念
摘要:对unix os上的一些基本概念做一个统一的梳理,以下内容转自互联网和相关书籍 一 进程组.会话.控制终端 进程组---------------------------------------- ...
- Android的px、dp和sp
Android的px.dp和sppx: 即像素,1px代表屏幕上一个物理的像素点:偶尔用到px的情况,是需要画1像素表格线或阴影线的时候. dp: 这个是最常用但也最难理解的尺寸单位.它与“像素密度” ...
- C ~ 链式队列与循环队列
此处的链式与循环队列可以应用于BFS和树的层序遍历.下面是对其结构和基本操作的程序描述. 1.循环队列 解决循环队列的队空和队满的方法: [1].增加一个参数count,用来记录数组中当前 ...
- C++11学习笔记
C++11 1.long long新类型 2.列表初始化 int t=0; int t={0}; int t(0); int t{0}; 注意:如果我们使用列表初始化有丢失信息的风险,则编译器报错 l ...