Я пытаюсь загрузить файл, используя сегменты конечной точки/:bucketKey/objects/:objectName/resumable Я всегда получаю код ответа 202 даже для последнего фрагмента. В соответствии с документацией я должен получить ответ 200 с некоторыми деталями урны для окончательной загрузки. Как это решить? Для тестирования я использовал файл размером 17 МБ. Но моя основная задача — загружать файлы большего размера. Ниже мой код:
byte[] bytes = uploadObjectRequest.getInputStream().readAllBytes();
int fileSize = bytes.length;
System.out.println("File size in bytes: "+ fileSize);
int chunkSize = 5 * 1024 * 1024 ;
int nbChunks = (fileSize / chunkSize) + 1;
try(ByteArrayInputStream isReader = new ByteArrayInputStream(bytes)){
for(int i = 0; i < nbChunks; i++){
int start = i * chunkSize;
int end = Math.min(fileSize, (i + 1) * chunkSize) - 1;
String range = "bytes " + start + "-" + end + "/" + fileSize;
// length of this piece
int contentLength = end - start + 1;
byte[] buffer = new byte[contentLength];
int count = isReader.read(buffer, 0, contentLength);
ByteArrayInputStream is = new ByteArrayInputStream(buffer);
uploadObjectRequest.setContentLength(contentLength);
uploadObjectRequest.setContentRange(range);
String sessionId = UUID.randomUUID().toString();
uploadObjectRequest.setSessionId(sessionId);
uploadObjectRequest.setInputStream(is);
System.out.println(String.format("For Chunk %s contentLength %s, contentRange %s, sessionId %s", i, contentLength, range, sessionId));
HttpResponse res = datamanagementAPI.uploadObjsInChunk(uploadObjectRequest, authenticator);
int status = res.getStatusLine().getStatusCode();
}
}





У меня есть пример в Node.js, опубликованный здесь. Вернемся к вашему коду, вам нужно изменить его следующим образом:
string sessionId = UUID.randomUUID().toString()
byte[] bytes = uploadObjectRequest.getInputStream().readAllBytes();
int fileSize = bytes.length;
System.out.println("File size in bytes: "+ fileSize);
int chunkSize = 5 * 1024 * 1024 ;
if ( fileSize < chunkSize ) {
// Do a standard upload since OSS will reject any chunk less than 2Mb
// At the same time, using the chunk approach for small files has a cost.
// So let's say 5Mb is our limit.
...
return;
}
int nbChunks = (int) Math.floor(fileSize / chunkSize);
if ((fileSize % chunkSize) != 0)
nbChunks++;
try(ByteArrayInputStream isReader = new ByteArrayInputStream(bytes)){
for(int i = 0; i < nbChunks; i++){
int start = i * chunkSize;
int end = start + chunkSize - 1;
if (end > fileSize - 1)
end = fileSize - 1;
String range = "bytes " + start + "-" + end + "/" + fileSize;
// length of this piece
int contentLength = end - start + 1;
byte[] buffer = new byte[contentLength];
int count = isReader.read(buffer, 0, contentLength);
ByteArrayInputStream is = new ByteArrayInputStream(buffer);
uploadObjectRequest.setContentLength(contentLength);
uploadObjectRequest.setContentRange(range);
String sessionId = sessionId;
uploadObjectRequest.setSessionId(sessionId);
uploadObjectRequest.setInputStream(is);
System.out.println(String.format("For Chunk %s contentLength %s, contentRange %s, sessionId %s", i, contentLength, range, sessionId));
HttpResponse res = datamanagementAPI.uploadObjsInChunk(uploadObjectRequest, authenticator);
int status = res.getStatusLine().getStatusCode();
}
}
После разговора обратите внимание, что sessionId должен быть одинаковым для всех загрузок чанков. В противном случае OSS не сможет объединить все фрагменты вместе.
У меня вернулся код 200, если последний чек 202, значит не все байты были получены. Я изменил ваш код, чтобы отразить мой код, который работает нормально. Не могли бы вы поделиться со мной своим кодом/проектом, и я тестирую и отлаживаю его здесь. мой адрес электронной почты cyrille at autodesk dot com
Проблема решена: идентификатор сеанса должен быть одинаковым для всех фрагментов.
Я не вижу никакой разницы в этом коде, так как он также будет вычислять те же числа для размера фрагмента, количества фрагментов и т. д. Но все же я использовал код, которым вы поделились, и получил тот же результат. Я получил код ответа 202 для всех фрагментов (и для последнего фрагмента), но он должен вернуть 200 для последнего фрагмента.