暑假已经过了一半了,这才完成计划当中的第二个任务。虽然进度是慢了点。但也算是暑假的收获吧。下面我就把我学习当中的收获记录在此。

还是跟以往一样,先上图片。

操作的步骤:打开程序----》选择上传的照片-----》点击返回键------》显示没有选择上传图片的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、图片、音乐等)的更多相关文章

  1. https 协议下服务器根据网络地址下载上传文件问题

    https 协议下服务器根据网络地址下载上传文件遇到(PKIX:unable to find valid certification path to requested target 的问题) 使用h ...

  2. Http请求之基于HttpUrlConnection,支持Header,Body传值,支持Multipart上传文件:

    Http请求之基于HttpUrlConnection,支持Header,Body传值,支持Multipart上传文件: public static String post(String actionU ...

  3. asp dotnet core 支持客户端上传文件

    本文告诉大家如何在 asp dotnet core 支持客户端上传文件 新建一个 asp dotnet core 程序,创建一个新的类,用于给客户端上传文件的信息 public class Kanaj ...

  4. 使用input:file控件在微信内置浏览器上传文件返回未显示选择的文件

    使用input:file控件在微信内置浏览器上传文件返回未显示选择的文件 原来的写法: <input type="file" accept="image/x-png ...

  5. Android 上传文件,图片。以及服务器端接收相关。

    前面一篇文章写了实现照相功能的一个例子,其实那个实现效果是个略缩图.要查看全图就要先指定照片的存放路径.以后我会修改那个文章.今天先说下图片,文件等上传的实现.接着拿照片说事,光照完了不行还得往服务器 ...

  6. Android学习笔记_13_网络通信之多个上传文件

    一.获取HTTP协议: 建立一个Web项目,建立一个如下所示的jsp界面,用IE捕获表单提交信息. <%@ page language="java" contentType= ...

  7. IE浏览器上传文件时本地路径变成”C:\fakepath\”的问题【转】

    转自:http://www.iefans.net/ie-shangchuan-bendi-lujing-fakepath/ 在使用<input id="file_upl" t ...

  8. IE浏览器上传文件时本地路径变成”C:\fakepath\”的问题

    在使用<input id="file_upl" type="file" />控件上传文件时,有时会需要获取文件本地路径展示给客户,这时可以通过这样的 ...

  9. 【TFS 2017】使用浏览器上传文件(TFVC)或者编辑代码,错误提示TF14098,需要对文件有PendChange 权限

    从TFS 2015开始,微软在TFS系统中增加了一个非常吸引开发人员的功能,"快速代码编辑器" (Quick Code Editor).使用这个功能,你可以在任何安装了浏览器的设备 ...

随机推荐

  1. JS魔法堂:元素克隆、剪切技术研究

    一.前言 当需要新元素时我们可以通过 document.createElement 接口来创建一个全新的元素,也可以通过克隆已有元素的方式来获取一个新元素.而在部分浏览器中,通过复制来获取新元素的效率 ...

  2. C#开源

    商业协作和项目管理平台-TeamLab 网络视频会议软件-VMukti 驰骋工作流程引擎-ccflow [免费]正则表达式测试工具-Regex-Tester Windows-Phone-7-SDK E ...

  3. C#中协变与抗变(逆变)

    泛型在.NET 2.0中正式的引入.在使用泛型的过程中,联系上面向对象的继承性.往往很容易想当然敲出类似以下代码 List<Animal> animalLst=new List<Do ...

  4. 【处理手记】U盘读不出+卷标丢失+像读卡器+大小0+无媒体

    Update:201307180945 今天这鸟问题又找上我了,照之前的方法做后没解决,我又做了些尝试,整个流程如下: 1.插上U盘,发现问题 2.以devmgr_show_nonpresent_de ...

  5. javascript的一些bug

    JavaScript是如今最受欢迎的编程语言之一,但受欢迎同时就是该语言自身的各种特性带来的副作用,无论该语言多美妙,每天还是有成千上万的程序员弄出一堆bug.先不要嘲笑别人,或许你也是其中之一. 给 ...

  6. 基于吉日嘎底层架构的通用权限管理Web端UI更新:参考DTcms后台界面

    经一周的研究学习,看了国内的H+.HUI等,国外的PaperDashboardPro.Make.Metronic BootStrap等,最终选定用一个轻量的,适合中国人的,来自DTcms的后台管理UI ...

  7. jquery简单原则器(匹配第一个元素)

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  8. Android获取ROOT权限

    获取Android的ROOT权限其实很简单,只要在Runtime下执行命令"su"就可以了. // 获取ROOT权限 public void get_root(){ if (is_ ...

  9. 【Java每日一题】20161124

    package Nov2016; public class Ques1124 { public static void main(String[] args) { Parent p = new Sub ...

  10. mysql中,ENCODE警告---Warning Code : 1287

    mysql中,ENCODE警告 共 1 行受到影响, 1 个警告 执行耗时 : 0.072 sec传送时间 : 0.001 sec总耗时 : 0.073 sec Warning Code : 1287 ...