Загрузить файл с помощью CloudConvert API программно - PullRequest
0 голосов
/ 23 января 2020

Я пытаюсь сделать петицию на https://api.cloudconvert.com/v2/import/upload, чтобы я мог загрузить локальный файл перед его обработкой. Вот мой код:

public String upload (File file) throws IOException {

    HttpURLConnection connection = (HttpURLConnection) ConfigGlobal.getUrlUpload().openConnection();
    connection.setDoOutput(true);
    connection.setRequestMethod("POST");

    connection.setRequestProperty("Authorization", "Bearer " + ConfigGlobal.getKey());
    connection.setRequestProperty("Content-Type", "multipart/form-data; boundary=" + boundary);

    this.addFile(connection);

    OutputStream os = connection.getOutputStream();
    OutputStreamWriter osw = new OutputStreamWriter(os, StandardCharsets.UTF_8);

    /* This line gets the body of my request, in this case:

    {
        "tasks": {
            "import-1": {
                "operation": "import/upload"
            }
        }
    }

    and adds it to the connection */
    osw.write(tasks.getCodeAbsolute());

    osw.flush();
    osw.close();
    os.close();

    System.out.println(tasks.getCodeAbsolute());

    connection.connect();

    JsonNode response = HttpHelper.getJsonAnswer(connection);

    return response.toString();

}

public void addFile (HttpURLConnection connection)
        throws IOException {

    String charset = "UTF-8";
    File file= new File("C:/heiftests/test.heic");
    String boundary = Long.toHexString(System.currentTimeMillis()); // Just generate some unique random value.
    String CRLF = "\r\n"; // Line separator required by multipart/form-data.

    try (
            OutputStream output = connection.getOutputStream();
            PrintWriter writer = new PrintWriter(new OutputStreamWriter(output, charset), true);
    ) {

        // Send binary file.
        writer.append("--" + boundary).append(CRLF);
        writer.append("Content-Disposition: form-data; name=\"file\"; filename=\"" + file.getName() + "\"").append(CRLF);
        writer.append("Content-Transfer-Encoding: binary").append(CRLF);
        writer.append(CRLF).flush();
        Files.copy(file.toPath(), output);
        output.flush(); // Important before continuing with writer!
        writer.append(CRLF).flush(); // CRLF is important! It indicates end of boundary.

        // End of multipart/form-data.
        writer.append("--" + boundary + "--").append(CRLF).flush();
    }

}

Я могу запустить этот код и получить ответ в ответ:

{
"data": {
    "id": "9de15252-01cf-466d-9dfd-135acd5fdb0a",
    "job_id": null,
    "status": "waiting",
    "credits": null,
    "code": null,
    "message": "Waiting for file upload",
    "percent": 100,
    "operation": "import/upload",
    "result": {
        "form": {
            "url": "https://storage.de.cloud.ovh.net/v1/AUTH_b2cffe8f45324c2bba39e8db1aedb58f/cloudconvert-files/9de15252-01cf-466d-9dfd-135acd5fdb0a/",
            "parameters": {
                "expires": 1579802089,
                "max_file_count": 1,
                "max_file_size": 10000000000,
                "redirect": "https://api.cloudconvert.com/v2/upload/redirect/9de15252-01cf-466d-9dfd-135acd5fdb0a",
                "signature": "10369888cdf74e46d62360ecefc0c231fd576c23"
            }
        }
    },
    "created_at": "2020-01-23T11:54:49+00:00",
    "started_at": null,
    "ended_at": null,
    "retry_of_task_id": null,
    "copy_of_task_id": null,
    "user_id": 40061079,
    "priority": -10,
    "host_name": null,
    "storage": "ovh-lim",
    "depends_on_task_ids": [],
    "links": {
        "self": "https://api.cloudconvert.com/v2/tasks/9de15252-01cf-466d-9dfd-135acd5fdb0a"
    }
}
}

, который является ожидаемым ответом. Однако через несколько секунд я смогу сделать запрос GET на https://api.cloudconvert.com/v2/tasks/9de15252-01cf-466d-9dfd-135acd5fdb0a со своими учетными данными и получить ответ, который имеет готовое состояние и ссылку. Тем не менее, я продолжаю получать «ожидающий» статусный ответ, и через некоторое время я получаю «ошибочный» статусный ответ с сообщением «ошибка загрузки». Этот ответ не дает больше информации, поэтому очень сложно определить, почему мой код не работает. Поскольку мои учетные данные работают в остальной части моего приложения, я предполагаю, что ошибка связана с тем, как файл добавляется в запрос.

Кстати, я знаю, что мой код ужасен, я просто тестирование, поэтому я даже не беспокоюсь об удалении неиспользуемых переменных. Если вы видите такие вещи, просто игнорируйте их.

Кто-нибудь знает, в чем проблема?

...