Microsoft Graph Api Загрузка большого файла в папку

#c# #sharepoint #microsoft-graph-api

#c# #sharepoint #microsoft-graph-api

Вопрос:

Я пытаюсь загрузить файлы размером более 4 Мб в папку в списке Sharepoint с помощью LargFileUploadTask. Кажется, что код создает временные файлы после PostAsync в папке «cities». Я вижу созданный файл, т. е. ~tmphamilton.png. Но когда вызывается UploadAsync, он завершается с ошибкой и возвращает «Источник не найден»

Код отлично работает, когда я удаляю путь к папке при создании uploadSession

Есть идеи, что я могу делать неправильно?

    // create an upload session
var uploadSession = await graphClient.Sites("site id").Drive().Root().ItemWithPath("citieshamilton.png").CreateUploadSession().Request().PostAsync();

var maxSliceSize = 320 * 1024; // 320 KB - Change this to your slice size. 5MB is the default.

var largeFileUploadTask = new LargeFileUploadTask(uploadSession, stream, maxSliceSize);

// upload away with relevant callback
DriveItem itemResult = await largeFileUploadTask.UploadAsync( progress );
  

Комментарии:

1. Вы убедились, что предыдущий сеанс для файла с тем же именем закрыт / истек. У меня были похожие проблемы, когда какой-либо аспект загрузки не удался, тогда дальнейшие загрузки не будут работать в течение ~ 4 часов? до истечения срока действия неудачных (и незакрытых) сеансов.

Ответ №1:

Убедитесь, что макс. параметр размера загрузки в вашем веб-приложении больше, чем ваш файл. В зависимости от местоположения загрузки и версии SharePoint это может быть не более 50 МБ. В помещении его можно настроить в CentralAdmin-> Управление приложениями-> Веб-приложение xy-> Общие настройки

Проверьте также https://learn.microsoft.com/de-de/archive/blogs/bgeoffro/list-attachments-over-50mb-need-more-than-an-increase-in-maximum-upload-size

Ответ №2:

Вы можете успешно загрузить файл в корень библиотеки документов? Смотрите код ниже.

 string siteId = WebConfigurationManager.AppSettings.Get("SiteId");
string libraryName = WebConfigurationManager.AppSettings.Get("LibraryName");
string fileName = filePath.Substring(filePath.LastIndexOf("\")   1);

var uploadSession = await graphServiceClient.Sites[siteId].Lists[libraryName].Drive.Root
.ItemWithPath(fileName)
.CreateUploadSession(uploadProps)
.Request()
.PostAsync();
  

Комментарии:

1. Да, это работает, найдите загрузку в корень, но не в папку, т.Е. ItemWithPath(«hamilton.png») работает, но ItemWithPath(«cities hamilton.png») не работает

Ответ №3:

У меня это работает с Graph 3.1.4 и Java, мне потребовалось некоторое время, чтобы заставить его работать, но загрузка файла > 4 МБ достаточно эффективна…

// itemPath — это что-то вроде «/MyFolder/DailyUpload/»

   public CompletableFuture UploadFileToSharePoint(String idSite, String parentId, String itemPath, String fileName, InputStream file) {
    final List<Option> options = new LinkedList<Option>();
    try {
      return  mClient
                .sites(idSite)
                .drive()
                .root()
                .itemWithPath(itemPath  Build.ID.toUpperCase() "/" fileName)
                .createUploadSession(
                        DriveItemCreateUploadSessionParameterSet.newBuilder()
                        .withItem(new DriveItemUploadableProperties())
                        .build())
                .buildRequest(options)
                .postAsync().thenCompose(uploadSession -> {

            byte[] data = null;
            try {
                    byte[] buff = new byte[file.available()];
                    int bytesRead = 0;
                    ByteArrayOutputStream bao = new ByteArrayOutputStream();
                    while ((bytesRead = file.read(buff)) != -1) {
                        bao.write(buff, 0, bytesRead);
                    }
                    data = bao.toByteArray();
            }
            catch (IOException e) {
                e.printStackTrace();
            }

            if (data != null amp;amp; data.length>0) {
                final InputStream uploadFile = new ByteArrayInputStream(data); //"{"hehe":"haha"}".getBytes(StandardCharsets.UTF_8));
                try {
                    final long fileSize = (long) uploadFile.available();
                    LargeFileUploadTask<DriveItem> largeFileUploadTask = new LargeFileUploadTask<DriveItem>(uploadSession,
                            mClient, uploadFile, fileSize, DriveItem.class);
                    // If everything is fine, the procedure returns a DriveItem with the item already
                    return largeFileUploadTask.uploadAsync();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }

            return null;
        });
    }
    catch (IndexOutOfBoundsException e) {
        Log.d("GraphHelper", "UploadFileToSharePoint failed: "  e.getMessage());
        return CompletableFuture.completedFuture(false);
    }
}
  

Надеюсь, это поможет другим