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端的代码:

解决的办法是:

时间: 2024-12-29 05:28:46

Android上传图片到PHP服务器并且支持浏览器上传文件(word、图片、音乐等)的相关文章

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

https 协议下服务器根据网络地址下载上传文件遇到(PKIX:unable to find valid certification path to requested target 的问题) 使用httpclient  所有站点全部信任 不做身份鉴定: 1 public static CloseableHttpClient getHttpClient() throws Exception { 2 SSLConnectionSocketFactory sslsf = null; 3 Poolin

浏览器上传文件到PHP的几种方法

使用H5的方法来上传文件 优点是:上传过程很方便,简单 缺点:并不是所有的浏览器都支持,兼容性比较差,现阶段不推荐使用 <div class="fr"> <!--上传文件方法一:--> <form name="form1"> <div class="progress"> <div class="progress-bars" style="width:1%"

angularJS 在edge浏览器上传文件,无法主动触发ng-click

今天发现的问题 在谷歌浏览器一直运行良好的功能,在edge浏览器不能使用. 代码参考我的另一篇博客:WebAPI Angularjs 上传文件 不能运行的原因 下图红框中的代码在edge浏览器中无法执行,也就不能执行下面的上传文件代码. 解决方案 既然原因找到了,就可以寻找解决方案了,找了一下午,有一篇有用的文章:angular ng-click程序触发,方法 我的解决方案(注意加粗加大的代码[关键哟]) JS代码如下: define(['app'], function (app) { app.

AFNetworking框架_上传文件或图片到服务器

文中的 XXXXXXXXXX更具你自己的参数填写 - (void)uploadImageWithImage:(NSString *)imagePath { //上传其他所需参数 NSString *userId=XXXXXXXXXXX; NSString *token=XXXXXXXXXXX; //上传请求POST AFHTTPClient *client=[AFHTTPClient clientWithBaseURL:[NSURL URLWithString:@""]]; NSStr

浏览器上传文件+django后台处理

1,浏览器端端js程序 2,django后端处理程序 接收来自浏览器上传的文件,并把文件存储在一指定的路径下. product_id = request.POST.get('product_id') sign = request.POST.get('sign') file_size = request.POST.get('file_size') sw_ver = request.POST.get('sw_ver') file_dict = request.FILES.items() if not

解决微信内嵌浏览器无法响应上传文件(图片)的思路(2种办法)

进园一年多来,第一次写博客,好激动.原因主要是自己平时都是有写笔记,不习惯写博客,这次想写博客的原因是,这个问题确实我做了很久,已经做了近两周才解决了这个问题,,而且两周时间里尝试过了很多种办法,然后由于网上又没有多少人分享这个,决定自己写一下. 先自我介绍下,我是惠州学院大二(准大三)的学生,在去年暑假时候加了一个工作室开始写代码,也是在那个时候加入博客园,最近因为工作室要做微信端网页的开发需要一个上传图片功能,然后编码的时候发现用平时的方法做的上传功能在Android的微信端上实现不了,百度

浏览器上传文件夹的解决方案

众所皆知,web上传大文件,一直是一个痛.上传文件大小限制,页面响应时间超时.这些都是web开发所必须直面的. 本文给出的解决方案是:前端实现数据流分片长传,后面接收完毕后合并文件的思路. 实现文件夹上传,要求:服务端保留层级结构,支持10w级别的文件夹上传. 大文件上传及断点续传,要求:支持50G级的单个文件上传和续传.续传要求:在刷新浏览器后能够续传上传,在重启浏览器后能够继续上传上(关闭浏览器后重新打开),在重启电脑后能够继续上传. 支持PC端全平台,Windows,Mac,Linux 浏

Android项目——HttpUrlConnection上传文件(图片)

UI界面设计:     由于博客发布可能附加图片,但是图片(或者任何文件)信息必须放在http请求体的正文之中,这就需要我们使用HttpUrlConnection的时候构建Http正文. 我们先来看一下Http正文格式: 1 POST /api/feed/ HTTP/1.1 2 Accept-Encoding: gzip 3 Content-Length: 225873 4 Content-Type: multipart/form-data; boundary=OCqxMF6-JxtxoMDHm

【经验记录】Android上传文件到服务器

Android中实现上传文件,其实是很简单的,和在java里面是一样的,基本上都是熟悉操作输出流和输入流!还有一个特别重要的就是需要配置content-type的一些参数!如果这些都弄好了,上传就很简单了,下面是我写的一个上传的工具类: package com.spring.sky.image.upload.network; import java.io.DataOutputStream; import java.io.File; import java.io.FileInputStream;