使用xUtils下载和上传文件

    xUtils有四大常用的功能,这里我为大家介绍HttpUtils的下载和上传。
    第一步:从github上面下载xUtils.jar包。[链接](https://github.com/wyouflf/xUtils/)。下载完成之后放到自己建的项目libs目录下,如果没有就创建一个。然后在清单文件里面添加权限,在上面链接页面就有说明,复制粘贴即可。至此,前期准备工作已经完成。
    第二步:下载链接页面也有xUtils的介绍,或许大家不知道具体每个方法是什么意思,我这里为大家介绍下载和上传文件常用的方法。
    第三步:上传文件。在自己的项目创建如下方法,方法名,参数自己设置,方法里面的代码才是主要代码
public void photoUpload(String host, String token, String path) {

        HttpUtils utils = new HttpUtils(50000); // 设置连接超时
        //文件上传地址
        String uploadHost = host;
        RequestParams params = new RequestParams();
        // token的值,身份的唯一标识
        params.addHeader("token", token);
        // 文件的路径
        File file = new File(path);
        params.addBodyParameter("file", file, MIME.ENC_BINARY);
        utils.send(HttpMethod.POST, uploadHost, params,
                new RequestCallBack() {

                    @Override
                    public void onStart() {
                        super.onStart();
                        Toast.makeText(MainActivity.this, "开始上传",
                                Toast.LENGTH_LONG).show();
                    }

                    @Override
                    public void onLoading(long total, long current,
                            boolean isUploading) {
                        super.onLoading(total, current, isUploading);
                        System.out.println(current + "/" + total);

                    }

                    @Override
                    public void onSuccess(ResponseInfo arg0) {
                        Toast.makeText(MainActivity.this, "上传成功",
                                Toast.LENGTH_LONG).show();
                    }

                    @Override
                    public void onFailure(HttpException arg0, String arg1) {
                        System.out.println(arg0 + ":" + arg1);
                        Toast.makeText(MainActivity.this, arg1,
                                Toast.LENGTH_LONG).show();
                    }
                });
    }
服务器一般有返回参数,返回的参数在onSuccess()方法的参数里面,debug或者打印一下arg0的内容就可以了,arg0.result就是返回结果的字符串,打印出来查看,然后根据你们的要求获取就可以了。
    第四步:下载文件。
    public void download() {
    // 判断是否有SD卡
    if (Environment.getExternalStorageState().equals(
            Environment.MEDIA_MOUNTED)) {
        long availableSize = Utils.IO.availableSize();
        int downloadLength = downloadFileSize(url);
        //判断手机内存是否够下载文件
        if (availableSize >= downloadLength) {
            HttpUtils utils = new HttpUtils();
            String target = Environment.getDataDirectory()
                    + "/data/应用的包名/download/" + nameChapter
                    + ".mp3";
            handlerDownload = utils.download(url, target, true, true,
                    new RequestCallBack() {
                        @Override
                        public void onStart() {
                            super.onStart();
                            Toast.makeText(context, "开始下载",
                                    Toast.LENGTH_SHORT).show();

                        }

                        @Override
                        public void onLoading(long total, long current,
                                boolean isUploading) {
                            super.onLoading(total, current, isUploading);
                            System.out.println(current + "/" + total);

                        @Override
                        public void onSuccess(ResponseInfo arg0) {
                            Toast.makeText(context, "下载成功",
                                    Toast.LENGTH_SHORT).show();

                        }

                        @Override
                        public void onFailure(HttpException arg0,
                                String arg1) {
                            Toast.makeText(context, "下载失败",
                                    Toast.LENGTH_SHORT).show();
                        }
                    });
        }
    } else {
        Toast.makeText(context, "请先插入SD卡", Toast.LENGTH_SHORT).show();
    }
}

从网上下载东西一般都有两个判断,一、判断手机有没有装SD卡。二、判断手机内存够不够用。这里我给出了两个工具类:判断手机可用内存的方法。如下:
/**
     * 获取手机剩余内存大小
     * 
     * @return 手机剩余内存(单位:byte)
     */
    public static long availableSize() {
        // 取得SD卡文件路径
        File file = Environment.getExternalStorageDirectory();
        StatFs fs = new StatFs(file.getPath());
        // 获取单个数据块的大小(Byte)
        int blockSize = fs.getBlockSize();
        // 空闲的数据块的数量
        long availableBlocks = fs.getAvailableBlocks();
        return blockSize * availableBlocks;
    }
注释已经写的很清楚了。然后判断网络文件大小的方法。如下:
/**
 * 获取网络文件大小
 * 
 * @param path
 *            文件链接
 * @return 文件大小
 */
public int downloadFileSize(final String path) {
    new Thread() {
        public void run() {
            try {
                URL url = new URL(path);     //创建url对象
                HttpURLConnection conn = (HttpURLConnection) url
                        .openConnection();     //建立连接
                conn.setRequestMethod("GET");    //设置请求方法
                conn.setReadTimeout(5000);       //设置响应超时时间
                conn.setConnectTimeout(5000);   //设置连接超时时间
                conn.connect();   //发送请求
                int responseCode = conn.getResponseCode();    //获取响应码
                if (responseCode == 200) {   //响应码是200(固定值)就是连接成功,否者就连接失败
                    length = conn.getContentLength();    //获取文件的大小
                } else {
                    Toast.makeText(context, "连接失败", Toast.LENGTH_LONG)
                            .show();
                }

            } catch (MalformedURLException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }
        };
    }.start();
    return length;
}
这个,我跟人觉得也没有什么好说的,注释也很清楚。言归正传,我们上面的下载方法,首先由两个if语句,一个是判断是否手机装有SD卡,一个是判断手机剩余空间是否大于要下载文件的大小。然后就是剩下的那个主要方法了,那个才是下载文件的方法。这里我们会碰到好几个方法,因为不知道参数的意思而不会选择,这里我给出两个方法的用处:

三个参数的方法:
    utils.download(url, target, callback);
参数一:要下载网络文件的url链接
参数二 : 要保存在手机的位置
参数三:回调方法,没什么好说的,几个方法都一样的

五个参数的方法:
    utils.download(url, target, autoResume, autoRename, callback);
参数一:要下载网络文件的url链接
参数二:要保存在手机的位置
参数三:是否自动恢复下载(即支持断点下载)
参数四:是否重命名
参数五:回调方法
当不需要支持断点下载的时候就用三个参数的方法,当需要支持断点下载的时候就用五个参数的那个。怎么样才能暂停呢?其实很简单,就一个方法;handlerDownload.cancel();这样就暂停了,对象handlerDownload,请仔细看前面download方法。以上就是全部内容。有可能有很多朋友会碰到手机存储的问题,我这里再给出几个SD卡存储路径吧。
SD卡存储:
Environment.getDataDirectory():     /data
Environment.getRootDirectory():    /system
Environment.getDownloadCacheDirectory():     /cache
Environment.getExternalStorageDirectory():   /storage/emulated/0
比方说,我们要获取我们自己的应用的路径,应用一般都是安装再data/data目录下面
Environment.getDataDirectory(): +"/data/应用的包名/download/"
上面这个的意思就是把下载的文件保存在我们应用的download目录下面,如果没有download目录,会新建一个download目录。然后路径后面还要加上我们要保存的文件的名字。
至此,我要说的全部说完了。后面陆续会发表数据库操作方面的内容。

你可能感兴趣的:(Android)