java URLConnection对象上传和下载文件

上传文件的主要步骤:
1.创建 URL 以及 URLConnection对象
2.设置 URLConnection对象的连接参数,设置不使用缓存。
设置 URLConnection对象的请求属性Content-Type 为multipart/form-data
3.从连接对象中获取输出流
4.从磁盘中获取文件输入流
6.向连接对象的输出流中写出文件内容,每个文件内容使用风格符隔开
7.所有文件都写出完毕后向输出流中写出分割字符串,并刷新输出流。
8.使用输入流从服务器读取数据
9.关闭输出输入流,返回服务器响应结果。

下载文件的主要步骤:
1.创建 URL 以及 URLConnection对象
2.设置 URLConnection对象的连接参数
3.从连接对象中获取输入流,获取文件的名称与长度
4.实例化输出流对象,使用输出流将输入流中的文件数据循环写出到文件对象中。
5.关闭输出输入流,返回文件对象。

package com.lanshiqin.utils.http;

import java.io.*;
import java.net.URL;
import java.net.URLConnection;

/**
 * Created by 蓝士钦 on 2017/4/23.
 * Http工具类
 */
public class HttpUtil {

    /**
     * 上传文件
     *
     * @param actionURL 上次的目标路径地址
     * @param filePaths 上传的文件路径数组
     * @return 服务器响应数据
     */
    public static String uploadFile(String actionURL, String[] filePaths) {

        String towHyphens = "--";   // 定义连接字符串
        String boundary = "******"; // 定义分界线字符串
        String end = "\r\n";    //定义结束换行字符串
        try {
            // 创建URL对象
            URL url = new URL(actionURL);
            // 获取连接对象
            URLConnection urlConnection = url.openConnection();
            // 设置允许输入流输入数据到本机
            urlConnection.setDoOutput(true);
            // 设置允许输出流输出数据到服务器
            urlConnection.setDoInput(true);
            // 设置不使用缓存
            urlConnection.setUseCaches(false);
            // 设置请求参数中的内容类型为multipart/form-data,设置请求内容的分割线为******
            urlConnection.setRequestProperty("Content-Type", "multipart/form-data;boundary=" + boundary);

            // 从连接对象中获取输出流
            OutputStream outputStream = urlConnection.getOutputStream();
            // 实例化数据输出流对象,将输出流传入
            DataOutputStream dataOutputStream = new DataOutputStream(outputStream);

            // 遍历文件路径的长度,将路径数组下所有路径的文件都写到输出流中
            for (int i = 0; i < filePaths.length; i++) {
                // 取出文件路径
                String filePath = filePaths[i];
                // 获取文件名称
                String fileName = filePath.substring(filePath.lastIndexOf("/") + 1);
                // 向数据输出流中写出分割符
                dataOutputStream.writeBytes(towHyphens + boundary + end);
                // 向数据输出流中写出文件参数名与文件名
                dataOutputStream.writeBytes("Content-Disposition:form-data;name=file;filename=" + fileName + end);
                // 向数据输出流中写出结束标志
                dataOutputStream.writeBytes(end);

                // 实例化文件输入流对象,将文件路径传入,用于将磁盘上的文件读入到内存中
                FileInputStream fileInputStream = new FileInputStream(filePath);
                // 定义缓冲区大小
                int bufferSize = 1024;
                // 定义字节数组对象,用来读取缓冲区数据
                byte[] buffer = new byte[bufferSize];
                // 定义一个整形变量,用来存放当前读取到的文件长度
                int length;
                // 循环从文件输出流中读取1024字节的数据,将每次读取的长度赋值给length变量,直到文件读取完毕,值为-1结束循环
                while ((length = fileInputStream.read(buffer)) != -1) {
                    // 向数据输出流中写出数据
                    dataOutputStream.write(buffer, 0, length);
                }
                // 每写出完成一个完整的文件流后,需要向数据输出流中写出结束标志符
                dataOutputStream.writeBytes(end);
                // 关闭文件输入流
                fileInputStream.close();

            }
            // 向数据输出流中写出分隔符
            dataOutputStream.writeBytes(towHyphens + boundary + towHyphens + end);
            // 刷新数据输出流
            dataOutputStream.flush();

            // 从连接对象中获取字节输入流
            InputStream inputStream = urlConnection.getInputStream();
            // 实例化字符输入流对象,将字节流包装成字符流
            InputStreamReader inputStreamReader = new InputStreamReader(inputStream);
            // 创建一个输入缓冲区对象,将要输入的字符流对象传入
            BufferedReader bufferedReader = new BufferedReader(inputStreamReader);

            // 创建一个字符串对象,用来接收每次从输入缓冲区中读入的字符串
            String line;
            // 创建一个可变字符串对象,用来装载缓冲区对象的最终数据,使用字符串追加的方式,将响应的所有数据都保存在该对象中
            StringBuilder stringBuilder = new StringBuilder();
            // 使用循环逐行读取缓冲区的数据,每次循环读入一行字符串数据赋值给line字符串变量,直到读取的行为空时标识内容读取结束循环
            while ((line = bufferedReader.readLine()) != null) {
                // 将缓冲区读取到的数据追加到可变字符对象中
                stringBuilder.append(line);
            }

            // 依次关闭打开的输入流
            bufferedReader.close();
            inputStreamReader.close();
            inputStream.close();

            // 依次关闭打开的输出流
            dataOutputStream.close();
            outputStream.close();

            // 返回服务器响应的数据
            return stringBuilder.toString();

        } catch (IOException e) {
            e.printStackTrace();
        }
        return null;
    }


    /**
     * 下载文件
     *
     * @param urlAddress  文件url地址
     * @param downloadDir 文件保存的目录
     * @return 文件
     */
    public static File downloadFile(String urlAddress, String downloadDir) {

        try {
            // 创建URL对象
            URL url = new URL(urlAddress);
            // 获取连接对象
            URLConnection urlConnection = url.openConnection();
            // 设置允许输入流输入数据到本地
            urlConnection.setDoInput(true);
            // 设置允许输出流输出到服务器
            urlConnection.setDoOutput(true);
            // 获取内容长度
            int fileLength = urlConnection.getContentLength();
            // 获取文件url径名称
            String filePathName = urlConnection.getURL().getFile();
            // 获取文件名称
            String fileName = filePathName.substring(filePathName.lastIndexOf(File.separatorChar) + 1);

            // 定义文件下载的目录与名称
            String path = downloadDir + File.separatorChar + fileName;

            // 实例化文件对象
            File file = new File(path);

            // 判断文件路径是否存在
            if (!file.getParentFile().exists()) {
                // 如果文件不存在就创建文件
                file.getParentFile().mkdirs();
            }

            // 从连接对象中获取输入字节流
            InputStream inputStream = urlConnection.getInputStream();

            // 实例化输入流缓冲区,将输入字节流传入
            BufferedInputStream bufferedInputStream = new BufferedInputStream(inputStream);

            // 实例化输出流对象,将文件对象传入
            OutputStream outputStream = new FileOutputStream(file);

            // 定义整形变量用来接收读取到的文件大小
            int size;
            // 定义整形变量用来累计当前读取到的文件长度
            int len = 0;
            // 定义字节数组对象,用来从输入缓冲区中装载数据块
            byte[] buf = new byte[1024];
            // 从输入缓冲区中一次读取1024个字节的文件内容到buf对象中,并将读取大小赋值给size变量,当读取完毕后size=-1,结束循环读取
            while ((size = bufferedInputStream.read(buf)) != -1) {
                // 累加每次读取到的文件大小
                len += size;
                // 向输出流中写出数据
                outputStream.write(buf, 0, size);
                // 打印当前文件下载的百分比
                System.out.println("下载进度:" + len * 100 / fileLength + "%\n");
            }
            // 关闭输出流
            outputStream.close();
            // 关闭输入缓冲区
            bufferedInputStream.close();
            // 关闭输入流
            inputStream.close();

            // 返回文件对象
            return file;

        } catch (IOException e) {
            e.printStackTrace();
        }
        return null;
    }

}

作者:蓝士钦
链接:https://www.jianshu.com/p/545f3a109964
來源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值