#c# #file-upload #microsoft-graph-api #onedrive #microsoft-graph-sdks
#c# #загрузка файла #microsoft-graph-api #onedrive #microsoft-graph-sdks
Вопрос:
Используйте OneDrive SDK для загрузки файлов.
В это время вы должны передать путь к файлу, но загрузка с использованием кода занимает много времени.
Могу ли я загружать файлы, даже если я передаю временный путь к файлу?
В настоящее время я получаю путь к файлу после сохранения файла на сервере.
В этом случае проблема возникает из-за проблем со скоростью.
Есть ли какой-нибудь способ посмотреть путь к временному файлу?
public async Task<JObject> UploadLargeFiles(string upn, IFormFile files)
{
var jObject = new JObject();
int fileSize = Convert.ToInt32(files.Length);
var folderName = Path.Combine("wwwroot", "saveLargeFiles");
var pathToSave = Path.Combine(System.IO.Directory.GetCurrentDirectory(), folderName);
var fullPath = "";
if (files.Length > 0)
{
var fileName = files.FileName;
fullPath = Path.Combine(pathToSave, fileName);
using (var stream = new FileStream(fullPath, FileMode.Create))
files.CopyTo(stream);
}
var filePath = fullPath;
var fileStream = System.IO.File.OpenRead(filePath);
GraphServiceClient client = await MicrosoftGraphClient.GetGraphServiceClient();
var uploadProps = new DriveItemUploadableProperties
{
ODataType = null,
AdditionalData = new Dictionary<string, object>
{
{ "@microsoft.graph.conflictBehavior", "rename" }
}
};
var item = this.SelectUploadFolderID(upn).Resu<
var uploadSession = await client.Users[upn].Drive.Items[item].ItemWithPath(files.FileName).CreateUploadSession(uploadProps).Request().PostAsync();
int maxChunkSize = 320 * 1024;
var uploadTask = new LargeFileUploadTask<DriveItem>(uploadSession, fileStream, maxChunkSize);
var response = await uploadTask.UploadAsync();
if (response.UploadSucceeded)
{
return
}
else
{
return null;
}
}
Ответ №1:
Вероятно, это замедляет работу не из-за диска вашего сервера. По умолчанию загруженные файлы хранятся во временном каталоге, который вы можете сохранить навсегда, используя CopyTo(FileStream)
, как вы делаете.
Вы можете пропустить этот шаг и вызвать IFormFile.OpenReadStream()
, чтобы получить поток во временный файл, а затем передать его LargeFileUploadTask
.
Дело в том, что, вероятно, загрузка в OneDrive занимает наибольшее количество времени. В зависимости от ваших настроек вы можете захотеть сохранить файлы в каталоге очереди (временный файл удаляется после завершения запроса), а фоновая служба считывает эту очередь и загружает их в OneDrive.