Я пытаюсь сделать петицию на 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 со своими учетными данными и получить ответ, который имеет готовое состояние и ссылку. Тем не менее, я продолжаю получать «ожидающий» статусный ответ, и через некоторое время я получаю «ошибочный» статусный ответ с сообщением «ошибка загрузки». Этот ответ не дает больше информации, поэтому очень сложно определить, почему мой код не работает. Поскольку мои учетные данные работают в остальной части моего приложения, я предполагаю, что ошибка связана с тем, как файл добавляется в запрос.
Кстати, я знаю, что мой код ужасен, я просто тестирование, поэтому я даже не беспокоюсь об удалении неиспользуемых переменных. Если вы видите такие вещи, просто игнорируйте их.
Кто-нибудь знает, в чем проблема?