Utilice el SDK de OneDrive para cargar archivos.

En este momento, debe pasar la ruta del archivo, pero la carga con el código lleva mucho tiempo.

¿Puedo cargar archivos incluso si paso la ruta del archivo temporal?

Actualmente obtengo la ruta del archivo después de guardar el archivo en el servidor.

En este caso, surge un problema por problemas de velocidad.

¿Hay alguna forma de ver la ruta del archivo temporal?

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).Result;
        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;
        }
    }
0
김세림 27 oct. 2020 a las 07:33

1 respuesta

La mejor respuesta

El disco de su servidor probablemente no es lo que hace que esto sea lento. De forma predeterminada, los archivos cargados se almacenan en un directorio temporal, que puede guardar permanentemente usando CopyTo(FileStream) como lo hace.

Puede omitir este paso y llamar a IFormFile.OpenReadStream() para obtener un flujo del archivo temporal, luego pasarlo al LargeFileUploadTask.

El punto es que probablemente sea la carga a OneDrive la que lleve la mayor cantidad de tiempo. Dependiendo de su configuración, es posible que desee guardar archivos en un directorio de cola (el archivo temporal se elimina después de que se completa la solicitud) y hacer que un servicio en segundo plano lea esa cola y los cargue en OneDrive.

0
CodeCaster 27 oct. 2020 a las 07:49