更新时间:2025-07-21 GMT+08:00
分享

分块下载文件示例

示例场景

本文介绍如何通过数据管理API代理器方式,对某个实体的实例化数据进行分块下载文件。

前提条件

安装数据管理API代理器时,已引入“file-download-sdk-1.0.0-SNAPSHOT”JAR包和添加相关依赖。

操作步骤

参考如下示例调用FileDownloader接口,分块下载test.zip文件。

    // 自动注入DelegatorConfig配置对象
    @Autowired
    private DelegatorConfig config;

    // 自动注入XdmTokenService服务对象
    @Autowired
    XdmTokenService xdmTokenService;

     /**
     * 文件分片下载
     * 
     * @throws IOException          I/O异常
     * @throws ExecutionException   并发异常
     * @throws InterruptedException 线程中断异常
     */
    @Test
    public void testDownLoadFile() throws IOException, ExecutionException, InterruptedException {
        HttpClient httpClient = defaultHttpClient();                                                     // 获取默认的apache httpclient客户端
        URL preSignedUrl = getPreSignedUrl(httpClient);                                                  // 获取预签名URL

        FileDownloader fileDownloader = new FileDownloader();                                            // 创建一个FileDownloader实例
        FileDescriptor fileDescriptor = new ObjectStorageFileDescriptor(preSignedUrl, httpClient);       // 使用预签名URL创建一个FileDescriptor对象
        File file = new File("D:/work/Demo/" + fileDescriptor.getFileName());                            // 定义要保存文件的目标路径
        Future<File> download = fileDownloader.download(fileDescriptor, 5, 200 * 1024 * 1024, file);     // 下载文件并返回一个Future对象
        download.get();
        boolean done = download.isDone();                                                                // 检查下载是否完成
        System.out.println(done);
    }

     /**
     * 获取预签名URL的方法。
     * 
     * @param httpClient HttpClient实例
     * @return 返回预签名URL
     * @throws IOException 如果发生I/O错误
     */
    private URL getPreSignedUrl(HttpClient httpClient) throws IOException {
        // 构建基础URL
        String url = String.format(Locale.ROOT, "%s/%s/services/%s/%s", this.config.getDomain(), this.config.getSubAppId(), "rdm/basic/api/v2/file", "downloadFile");
        // 添加查询参数构建完整的URL模板
        String urlTemplate = UriComponentsBuilder.fromHttpUrl(url)
            .queryParam("model_name", "yourModelName")
            .queryParam("model_number", "yourModelNumber")
            .queryParam("instance_id", "yourInstanceId")
            .queryParam("application_id", "yourApplicationId")
            .queryParam("is_master_attr", "yourIsMasterAttr")
            .queryParam("attribute_name", "yourAttributeName")
            .queryParam("file_ids", "yourFileIds")
            .queryParam("download_type", "OUTBOUND_LINK")
            .queryParam("tenant_id", new Object[] {"yourTenantId"})
            .encode()
            .toUriString();
        URL downloadUrl = new URL(urlTemplate);                                    // 创建URL对象
        HttpGet httpGet = new HttpGet(downloadUrl.toString());                     // 创建HttpGet请求
        httpGet.addHeader("X-AUTH-TOKEN", this.xdmTokenService.getToken());        // 设置请求头
        HttpResponse execute = httpClient.execute(httpGet);                        // 执行请求并获取响应
        return new URL(execute.getFirstHeader("Location").getValue());             // 从响应中获取重定向地址作为预签名URL
    }

    /**
     * 支持的加密套件列表。
     */
    private static final List<String> SUPPORTED_CIPHER_SUITES = Collections.unmodifiableList(
        Arrays.asList("TLS_DHE_RSA_WITH_AES_128_GCM_SHA256", "TLS_DHE_RSA_WITH_AES_256_GCM_SHA384",
            "TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256", "TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384",
            "TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256", "TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384"));

    /**
     * 创建默认的HttpClient实例。
     * 
     * @return 返回HttpClient实例
     */
    public HttpClient defaultHttpClient() {
        try {
            // 创建SSL上下文
            SSLContext sslContext = (new SSLContextBuilder()).setSecureRandom(SecureRandom.getInstanceStrong())
                .loadTrustMaterial((KeyStore) null, (chain, authType) -> {
                    return true;
                })
                .build();
            // 创建SSL连接套接字工厂
            SSLConnectionSocketFactory sslConnectionSocketFactory =
                new SSLConnectionSocketFactory(sslContext, new String[] {"TLSv1.2"},
                    (String[]) SUPPORTED_CIPHER_SUITES.toArray(new String[0]), NoopHostnameVerifier.INSTANCE);
            RequestConfig requestConfig =
                RequestConfig.custom().setSocketTimeout(300000).setConnectTimeout(20000).build();
            // 创建请求配置
            return HttpClients.custom()
                .disableRedirectHandling()
                .setDefaultRequestConfig(requestConfig)
                .setConnectionTimeToLive(20L, TimeUnit.SECONDS)
                .setMaxConnPerRoute(40)
                .setSSLSocketFactory(sslConnectionSocketFactory)
                .setMaxConnTotal(120)
                .build();
        } catch (KeyStoreException | KeyManagementException | NoSuchAlgorithmException var3) {
            GeneralSecurityException e = var3;
            throw new DownloadException(e);
        }
    }

相关文档