关于Android 文件分片 断点上传

由于项目需求,要尽量减少上传流量的消耗。因此,此处用到了文件的分片技术,即把文件分片,分成若干个小的文件,依次上传,来减少流量消耗。

  • 一、 流程

    获取上传文件File—把文件File分片,获取分片文件地址列表 List—实现List的循环上传。

  • 二、 分片

    此次获取分片文件地址列表

/**
     * 
     * @param context
     * @param tag  文件的唯一标识
     * @param sourceFilePath  要分片文件的地址
     * @param partFileLength  分片的大小 byte
     * @return
     * @throws Exception
     */
    public static List fileList(Context context, String tag, String sourceFilePath, int partFileLength) throws Exception {

        List fileList = new ArrayList<>();

        File sourceFile = null;//要分片的文件
        File targetFile = null;//分片时实例出来的文件
        InputStream ips = null;//要分片文件转换的输入流
        OutputStream ops = null;//分片后,分片文件的输出流

        OutputStream configOps = null;//该文件流用于存储文件分割后的相关信息,包括分割后的每个子文件的编号和路径,以及未分割前文件名
        Properties partInfo = null;//properties用于存储文件分割的信息
        byte[] buffer = null;


        sourceFile = new File(sourceFilePath);//待分割文件
        ips = new FileInputStream(sourceFile);//找到读取源文件并获取输入流

        configOps = new FileOutputStream(new File(GetPhotoSplitPath(context) + "/config.properties"));
        buffer = new byte[partFileLength];//开辟缓存空间
        int tempLength = 0;
        partInfo = new Properties();//key:1开始自动编号 value:文件路径

        while ((tempLength = ips.read(buffer, 0, partFileLength)) != -1) {
            String targetFilePath = GetPhotoSplitPath(context) + "/" + tag + "_" + partNumber;//分割后的文件路径
            partInfo.setProperty((partNumber++) + "", targetFilePath);//将相关信息存储进properties
            targetFile = new File(targetFilePath);
            ops = new FileOutputStream(targetFile);//分割后文件
            ops.write(buffer, 0, tempLength);//将信息写入碎片文件

            ops.close();//关闭碎片文件
            fileList.add(targetFilePath);
        }
        partInfo.setProperty("name", sourceFile.getName());//存储源文件名
        partInfo.store(configOps, "ConfigFile");//将properties存储进实体文件中
        ips.close();//关闭源文件流

        return fileList;
    }
  • 三、 上传

上传时,一定要保存好上传记录,用图片的唯一标识去保存上传的进度。
上传时,用循环上传,不要使用for循环。上传是耗时操作,for循环并发上传,无法控制上传进度。


参考:https://blog.csdn.net/cqulyk/article/details/38471505

你可能感兴趣的:(关于Android 文件分片 断点上传)