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

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

操作的步骤:打开程序----》选择上传的照片-----》点击返回键------》显示没有选择上传图片的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. 测试Servlet生命周期学习笔记

    测试环境:windows xp旗舰版 软件环境:myclipse8.5+tomcat7.0 ****************************************************** ...

  2. Azure ARM (9) 创建ARM模式下的虚拟机网络

    <Windows Azure Platform 系列文章目录> 笔者在之前几章内容中,创建了ARM Resource Group,然后在这个ARM Resource Group下创建Azu ...

  3. .net 使用Json(),maxJsonLength属性设置的值问题

    “使用JSON JavaScriptSerializer进行序列化或反序列化时出错.字符串的长度超过了为maxJsonLength属性设置的值” 今天业务找我说线上的国家地区都显示数字(地区ID),而 ...

  4. Struts2 源码分析——调结者(Dispatcher)之准备工作

    章节简言 上一章笔者讲到关于struts2过滤器(Filter)的知识.让我们了解到StrutsPrepareFilter和StrutsExecuteFilter的作用.特别是StrutsPrepar ...

  5. Android Studio添加PNG图片报错原因

    今天在网上看到一个关于Splash Activity的Android帖子,博主在一通讲解之后也给出了代码.于是果断下载下来了看看怎么实现的.一步步照着流程把这个功能实现了一遍.一切都没有大问题,但是在 ...

  6. ASP.NET MVC系列:为已有模型添加新的属性

    在模型类Movie中添加一个新的属性Rating

  7. 实现多表关联来方便你的SELECT查询功能

    这次来学习一下多表关联.比如在数据中创建下面几张表,你可以从主键PRIMARY KEY与外键FOREIGN KEY来看到这几张表它们之间的关系. 场所表[dbo].[SixS_Location]: 主 ...

  8. 为什么我不建议你做APP?

    最近迷上了新产品的可行性分析和推演. 有几个朋友也准备跳入创业火坑了,找到我说帮忙做做产品分析和可行性讨论,欣然应允. 我一向厌恶纯凭感觉拍脑袋的方式,所以对于我不了解的行业,都会从行业背景.现状痛点 ...

  9. 通过泛型数据,操作SQL数据库

    本人在操作数据库的时候,采用将对象的形式操作传入数据库,经过大量百度和朋友帮助,总结出如下两个接口.用于插入数据,提取数据. 要这样操作的前提条件,就是类名和表名一致,类字段和表字段一致就可以了 // ...

  10. 本地电脑安装和配置Redis操作客户端

    下载需要的文件:http://pan.baidu.com/s/1gdfQePl 把这个下载下来解压就可以了,如图所示     第一步(配置本地服务) 点击run这个DOS执行命令 因为是自己的电脑测试 ...