#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);
}
}
Надеюсь, это поможет другим