Android--okhttp与php交互,文件上传下载

简介: 版权声明:本文为博主原创文章,转载请标明出处。 https://blog.csdn.net/chaoyu168/article/details/77880320 okhttp配置:okhttp的下载地址:http://square.
版权声明:本文为博主原创文章,转载请标明出处。 https://blog.csdn.net/chaoyu168/article/details/77880320

okhttp配置:

okhttp的下载地址:http://square.github.io/okhttp/

okio的下载地址: https://github.com/square/okio

两个jar包导入到工程中,放在libs目录下,右键点击jar包,选择Add As Library就行了,两个包都要添加。

import java.io.FileOutputStream;
    import java.io.IOException;

    import android.Manifest;
    import android.app.Activity;
    import android.content.Intent;
    import android.content.pm.PackageManager;
    import android.graphics.Bitmap;
    import android.net.Uri;
    import android.os.Build;
    import android.os.Environment;
    import android.support.v4.app.ActivityCompat;
    import android.support.v4.content.ContextCompat;
    import android.support.v7.app.AppCompatActivity;
    import android.os.Bundle;
    import android.view.View;
    import android.widget.Button;
    import android.widget.ProgressBar;
    import android.widget.TextView;
    import android.widget.Toast;

    import java.io.File;
    import java.io.IOException;
    import java.io.InputStream;
    import java.util.concurrent.TimeUnit;

    import okhttp3.Call;
    import okhttp3.Callback;
    import okhttp3.Interceptor;
    import okhttp3.MediaType;
    import okhttp3.MultipartBody;
    import okhttp3.OkHttpClient;
    import okhttp3.Request;
    import okhttp3.RequestBody;
    import okhttp3.Response;
    import okhttp3.ResponseBody;
    import okio.Buffer;
    import okio.BufferedSink;
    import okio.BufferedSource;
    import okio.ForwardingSink;
    import okio.ForwardingSource;
    import okio.Okio;
    import okio.Sink;
    import okio.Source;

    public class MainActivity extends AppCompatActivity {

        private OkHttpClient okHttpClient;
        private TextView textView;
        private File tempFile;
        private File targetFile;
        private String path;
        private Button button1;
        private Button button2;
        private Button button3;
        private Button button4;
        //private long time;

        private static final int REQUEST_EXTERNAL_STORAGE = 1;
        private static final int FILE_SELECT_CODE = 1;
        private static String[] PERMISSIONS_STORAGE = {
                Manifest.permission.READ_EXTERNAL_STORAGE,
                Manifest.permission.WRITE_EXTERNAL_STORAGE
        };

        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            setTitle("上传文件并显示进度");
            //verifyStoragePermissions(MainActivity.this);

            textView = (TextView) findViewById(R.id.tv1);
            button1 = (Button) findViewById(R.id.btn_choose);
            button2 = (Button) findViewById(R.id.btn_upload);
            button3 = (Button) findViewById(R.id.btn_download);
            button4 = (Button) findViewById(R.id.btn_display);
            path = "";

            okHttpClient = new OkHttpClient.Builder()
                    .readTimeout(60, TimeUnit.SECONDS)
                    .connectTimeout(10, TimeUnit.SECONDS)
                    .writeTimeout(120, TimeUnit.SECONDS)
                    .build();

            button1.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    showFileChooser();
                }
            });

            button2.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    startUploadClick();
                }
            });

            button3.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    startDownloadClick();
                }
            });

            button4.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    Intent intent = new Intent(MainActivity.this,DisplayActivity.class);
                    startActivity(intent);
                }
            });
        }

                //打开文件选择器
        private void showFileChooser() {
            Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
            intent.setType("*/*");
            intent.addCategory(Intent.CATEGORY_OPENABLE);

            try {
                startActivityForResult( Intent.createChooser(intent, "Select a File to Upload"), FILE_SELECT_CODE);
            } catch (android.content.ActivityNotFoundException ex) {
                Toast.makeText(this, "Please install a File Manager.",  Toast.LENGTH_SHORT).show();
            }
        }

        @Override
        protected void onActivityResult(int requestCode, int resultCode, Intent data)  {
            switch (requestCode) {
                case FILE_SELECT_CODE:
                    if (resultCode == RESULT_OK) {
                        // Get the Uri of the selected file
                        Uri uri = data.getData();
                        path = FileUtils.getPath(this, uri);
                    }
                    break;
            }
            super.onActivityResult(requestCode, resultCode, data);
        }

        public String getFileName(String pathandname){

            int start=pathandname.lastIndexOf("/");
            //int end=pathandname.lastIndexOf("");
            if(start!=-1 ){
                return pathandname.substring(start+1);
            }else{
                return null;
            }

        }

        //点击按钮开始上传文件
        public void startUploadClick() {
            //tempFile = new File(Environment.getExternalStorageDirectory().getAbsolutePath() + File.separator + "test1.txt");
            //showFileChooser();
            String fileName = "";
            tempFile = new File(path);
            //tempFile = new File("/data/data/upload/man.jpg");

            if (tempFile.getName() == null){
                Toast.makeText(MainActivity.this, "找不到该文件!", Toast.LENGTH_SHORT).show();
            }
            else {
                fileName = getFileName(path);
            }

            RequestBody requestBody = new MultipartBody.Builder()
                    .setType(MultipartBody.FORM)
                    .addFormDataPart("file", fileName, RequestBody.create(MediaType.parse("image/jpg"), tempFile))
                    .build();
            //ProgressRequestBody progressRequestBody = new ProgressRequestBody(requestBody, progressListener);
            Request request = new Request.Builder()
                    .url("http://xxx.xxx.xxx.xx/receive_file.php")
                    .post(requestBody)
                    .build();
            //上面url中的内容请改成自己php文件的所在地址
            okHttpClient.newCall(request).enqueue(callback_upload);


        }

        //点击按钮开始下载文件
        public void startDownloadClick() {

            targetFile = new File("/data/data/com.example.ywy.mycloud1/cache/"  + "test1.jpg");

            Request request = new Request.Builder()
                    .url("http://xxx.xxx.xxx.xx/downloads/woman.jpg")
                    .build();
            okHttpClient.newCall(request).enqueue(callback_download);
            //上面url中的内容请改成自己想要下载的文件的所在地址
        }

        //上传请求后的回调方法
        private Callback callback_upload = new Callback() {
            @Override
            public void onFailure(Call call, IOException e) {
                setResult(e.getMessage(), false);
            }

            @Override
            public void onResponse(Call call, Response response) throws IOException {
                setResult(response.body().string(), true);
            }
        };

        private  Callback callback_download = new Callback() {
            @Override
            public void onFailure(Call call, IOException e) {
                setResult(e.getMessage(),false);
            }

            @Override
            public void onResponse(Call call, Response response) throws IOException {
                if(response != null) {
                    //下载完成,保存数据到文件
                    //verifyStoragePermissions(MainActivity.this);
                    InputStream is = response.body().byteStream();
                    FileOutputStream fos = new FileOutputStream(targetFile);
                    byte[] buf = new byte[1024];
                    int hasRead = 0;
                    while((hasRead = is.read(buf)) > 0) {
                        fos.write(buf, 0, hasRead);
                    }
                    fos.close();
                    is.close();
                    setResult("下载成功", true);
                }
            }
        };

        //显示请求返回的结果
        private void setResult(final String msg, final boolean success) {
            runOnUiThread(new Runnable() {
                @Override
                public void run() {
                    if (success) {
                        Toast.makeText(MainActivity.this, "请求成功", Toast.LENGTH_SHORT).show();
                    } else {
                        Toast.makeText(MainActivity.this, "请求失败", Toast.LENGTH_SHORT).show();
                    }
                    textView.setText(msg);
                }
            });
        }

}

import android.content.Context;
import android.database.Cursor;
import android.net.Uri;

/**
 * Created by YWY on 2016/11/9.
 */
public class FileUtils {

    public static String getPath(Context context, Uri uri) {

        if ("content".equalsIgnoreCase(uri.getScheme())) {
            String[] projection = { "_data" };
            Cursor cursor = null;

            try {
                cursor = context.getContentResolver().query(uri, projection,null, null, null);
                int column_index = cursor.getColumnIndexOrThrow("_data");
                if (cursor.moveToFirst()) {
                    return cursor.getString(column_index);
                }
            } catch (Exception e) {
                // Eat it
            }
        }

        else if ("file".equalsIgnoreCase(uri.getScheme())) {
            return uri.getPath();
        }

        return null;
    }
}

import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.ImageView;

public class DisplayActivity extends AppCompatActivity {

    private  ImageView imageView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_display);

        imageView = (ImageView)findViewById(R.id.iv);
        Bitmap bitmap = BitmapFactory.decodeFile("/data/data/com.example.ywy.mycloud1/cache/test1.jpg");
        imageView.setImageBitmap(bitmap);

    }
}



权限:

<uses-permission android:name="android.permission.INTERNET"/>
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>


PHP:
<?php
$base_path = "./text/"; //存放目录
if(!is_dir($base_path)){
    mkdir($base_path,0777,true);
}
$target_path = $base_path . basename ( $_FILES ['file'] ['name'] );
if (move_uploaded_file ( $_FILES ['file'] ['tmp_name'], $target_path )) {
  $array = array (
      "status" => true,
      "msg" => $_FILES ['file'] ['name'] 
  );
  echo json_encode ( $array );
} else {
  $array = array (
      "status" => false,
      "msg" => "There was an error uploading the file, please try again!" . $_FILES ['file'] ['error'] 
  );
  echo json_encode ( $array );
}
?>


 
 
 
 
 
 
 
 
 
 
 
 

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
目录
相关文章
|
2月前
|
安全 关系型数据库 MySQL
PHP与MySQL交互:从入门到实践
【9月更文挑战第20天】在数字时代的浪潮中,掌握PHP与MySQL的互动成为了开发动态网站和应用程序的关键。本文将通过简明的语言和实例,引导你理解PHP如何与MySQL数据库进行对话,开启你的编程之旅。我们将从连接数据库开始,逐步深入到执行查询、处理结果,以及应对常见的挑战。无论你是初学者还是希望提升技能的开发者,这篇文章都将为你提供实用的知识和技巧。让我们一起探索PHP与MySQL交互的世界,解锁数据的力量!
|
1月前
|
存储 SQL 关系型数据库
PHP与数据库交互:从基础到进阶
【10月更文挑战第9天】在编程的世界里,数据是流动的血液,而数据库则是存储这些珍贵资源的心脏。PHP作为一门流行的服务器端脚本语言,其与数据库的交互能力至关重要。本文将带你从PHP与数据库的基本连接开始,逐步深入到复杂查询的编写和优化,以及如何使用PHP处理数据库结果。无论你是初学者还是有一定经验的开发者,这篇文章都将为你提供宝贵的知识和技巧,让你在PHP和数据库交互的道路上更加从容不迫。
|
1月前
|
Java Linux Android开发
移动应用开发与操作系统的交互:深入理解Android和iOS
在数字时代,移动应用成为我们日常生活的一部分。本文将深入探讨移动应用开发的核心概念、移动操作系统的工作原理以及它们如何相互作用。我们将通过实际代码示例,展示如何在Android和iOS平台上创建一个简单的“Hello World”应用,并解释其背后的技术原理。无论你是初学者还是有经验的开发者,这篇文章都将为你提供有价值的见解和知识。
|
2月前
|
PHP
php常见问题,php.ini文件不存在或者找不到,mb_strlen()函数未定义系列问题,dll模块找不到的解决
本文介绍了解决PHP常见问题的步骤,包括定位和创建`php.ini`文件,以及解决`mb_strlen()`函数未定义和DLL模块加载错误的具体方法。
php常见问题,php.ini文件不存在或者找不到,mb_strlen()函数未定义系列问题,dll模块找不到的解决
|
3月前
|
Ubuntu 开发工具 Android开发
Repo下载AOSP源码:基于ubuntu22.04 环境配置,android-12.0.0_r32
本文介绍了在基于Ubuntu 22.04的环境下配置Python 3.9、安装repo工具、下载和同步AOSP源码包以及处理repo同步错误的详细步骤。
244 0
Repo下载AOSP源码:基于ubuntu22.04 环境配置,android-12.0.0_r32
|
3月前
|
存储 SQL 关系型数据库
PHP与MySQL交互的奥秘
【8月更文挑战第29天】在编程的世界里,PHP和MySQL就像是一对默契的舞伴,共同演绎着数据的交响曲。本文将带你探索它们之间的互动,从连接数据库到执行查询,再到处理结果,每一步都充满了节奏与和谐。我们将一起走进这段代码的旅程,感受数据流动的魅力。
|
29天前
|
Java 程序员 开发工具
Android|修复阿里云播放器下载不回调的问题
虽然 GC 带来了很多便利,但在实际编码时,我们也需要注意对象的生命周期管理,该存活的存活,该释放的释放,避免因为 GC 导致的问题。
33 2
|
2月前
|
前端开发 PHP
php学习笔记-php文件表单上传-day06
本文介绍了PHP文件上传处理流程、预定义变量`$_FILES`的使用、文件上传状态代码以及文件上传实现函数。同时,通过一个文件上传的小例子,演示了文件上传表单的创建、文件上传表单处理的PHP页面编写以及运行测试输出。
php学习笔记-php文件表单上传-day06
|
2月前
|
缓存 监控 算法
分析慢日志文件来优化 PHP 脚本的性能
分析慢日志文件来优化 PHP 脚本的性能
下一篇
无影云桌面