Загрузка файла с помощью SharePoint API: файл поврежден

#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 года. Я не могу поделиться им, это не будет иметь никакого смысла из-за обновлений. Извините