#java #microsoft-graph-api #inputstream
#java #microsoft-graph-api #входной поток
Вопрос:
Я разрабатываю библиотеку Java для базовых операций в SharePoint с использованием Graph API.
Я делаю вызов этой точки входа, используя SOAP UI:
https://graph.microsoft.com/v1.0/drives/{drive-id}/items/{item-id}/content
И я получаю необработанный ответ:
%PDF-1.6
%âãÏÓ
1751 0 obj
<</Filter/FlateDecode/First 98/Length 322/N 11/Type/ObjStm>>stream
hޜԽJ1†á[ÉL’ó“–m,md±ÁElTü)¼{3“wXYDØ©¾3!ç<)amp;I^kˆ!ymÁ¤gë¥ÍE ...
endstream
endobj
startxref
2993893
%%EOF
Похоже, я извлекаю входной поток.
В классе HttpRequest я пытаюсь создать объект ответа, который возвращает входной поток. Мое свойство FileInputStream является InputStream:
SharePointDownloadResponseModel returnValue = new SharePointDownloadResponseModel();
InputStream inputStream = new ByteArrayInputStream(response.toString().getBytes(StandardCharsets.UTF_8));
returnValue.setFileInputStream(inputStream);
return returnValue;
Теперь в моем классе manager я пытаюсь сохранить входной поток на жестком диске. Я обрабатываю 2 случая. В первом случае у меня есть имя файла и папка для хранения файла. Мой объект запроса :
if(request.getDownloadFolder() != null amp;amp; request.getFileName() !=null) {
InputStream initialStream = returnValue.getFileInputStream();
FileOutputStream fos = new FileOutputStream(request.getDownloadFolder() "/" request.getFileName());
BufferedOutputStream bos = new BufferedOutputStream(fos );
// Read bytes from URL to the local file
byte[] buffer = new byte[4096];
int bytesRead = 0;
System.out.println("Downloading " request.getFileName());
while ((bytesRead = initialStream.read(buffer)) != -1) {
bos.write(buffer, 0, bytesRead);
}
bos.flush();
// Close destination stream
bos.close();
// Close URL stream
initialStream.close();
}
Документ создается там, где он должен быть создан, но файл поврежден и не может быть открыт. Интересно, в чем проблема на данном этапе.
Комментарии:
1. Попробуйте повторить проблему с тем же вызовом API с помощью POSTMAN / MS Graph Explorer, чтобы узнать, можете ли вы все еще повторить проблему или нет.
2. Моя проблема не является проблемой Postman и не может быть воспроизведена.. В SOAP UI / Postman я получаю необработанный поток в качестве ответа. Моя проблема заключается в том, чтобы передать этот поток как значение объекта и преобразовать его в файл.
Ответ №1:
Я, наконец, решил свою проблему. Вот базовый метод, который показывает мою реализацию :
public class DownloadFile {
public static void main(String[] args) throws IOException {
String url = "https://graph.microsoft.com/v1.0/drives/{driveId}/items/{itemId}/content";
SharePointCredentialRequest sharePointCredentialRequest = new SharePointCredentialRequest(Constants.TENANT_CLIENT_ID,
Constants.TENANT_CLIENT_SECRET, Constants.TENANT_AUTHORITY);
String token = Utils.getToken(sharePointCredentialRequest);
CloseableHttpClient client = HttpClients.createDefault();
HttpGet httpGet = new HttpGet(url);
httpGet.setHeader("Authorization", "Bearer " token);
try (CloseableHttpResponse response = client.execute(httpGet)) {
HttpEntity entity = response.getEntity();
if (entity != null) {
System.out.println(response.getAllHeaders().length);
System.out.println(entity.getContentEncoding());
System.out.println(entity.getContentLength());
System.out.println(entity.getContentType().getElements().toString());
try {
// do something useful with the stream
InputStream inputStream = IOUtils.toBufferedInputStream(response.getEntity().getContent());
File targetFile = new File("C:\myFolder\kant.pdf");
FileUtils.copyInputStreamToFile(inputStream, targetFile);
} catch (IOException | UnsupportedOperationException e) {
e.printStackTrace();
}
}
}
}
}
Комментарии:
1. Пожалуйста, не могли бы вы поделиться реализацией этого класса. SharePointCredentialRequest sharePointCredentialRequest = новый SharePointCredentialRequest(константы. TENANT_CLIENT_ID, константы. TENANT_CLIENT_SECRET, константы. TENANT_AUTHORITY);
2. Реализация этого класса полностью изменилась за 2 года. Я не могу поделиться им, это не будет иметь никакого смысла из-за обновлений. Извините