Файл не загружается на Google Диск с помощью Google.Api.Drive.v3.Сервис привода

#c# #google-drive-api #.net-5 #closedxml

Вопрос:

Я борюсь с проблемой, из-за которой мой файл Excel не хочет загружаться на Google Диск. Я использую этот пакет в другой задаче hangfire, и эти файлы успешно загружаются. Я создаю файл excel с помощью ClosedXML. Я также протестировал этот код с существующим файлом excel, который я создал вручную, но он все еще не загружается.

Пожалуйста, посмотрите мой код ниже:

 using (var stream = new MemoryStream())
{
    Generate_Excel_File(customerReports, stream);
    await Save_And_Upload(stream, reportName, startDate, endDate, filePath);
}

private static void Generate_Excel_File(List<QuarterlyDirectCustomerReport> customerReports, MemoryStream stream)
{
    using (var workbook = new XLWorkbook())
    {
        var worksheet = workbook.Worksheets.Add("Direct Customers");

        var billTimes = customerReports
                        .Select(x => x.BillTime)
                        .OrderByDescending(x => x)
                        .Distinct()
                        .ToList();

        Generate_Header_Titles(worksheet, billTimes);
        Generate_Details(worksheet, customerReports, billTimes, out int lastRowIndex, out decimal[] totalAverageVariances);
        Generate_Totals(worksheet, customerReports, billTimes, lastRowIndex, totalAverageVariances);
        Adjust_Column_Width(worksheet);
        Set_Column_Format(worksheet);

        workbook.SaveAs(stream);
    }
}

private async Task Save_And_Upload(MemoryStream stream, string reportName, string start, string end, string filePath)
{
    try
    {
        //stream.Position = 0;

        //using (var fileStream = new FileStream(filePath, FileMode.Create, FileAccess.Write))
        //{
        //  stream.CopyTo(fileStream);
        //}

        using (var fileStream = File.Open(filePath, FileMode.Open))
        {
            //fileStream.Position = 0;
            await Upload_To_Google_Drive(fileStream, reportName, start, end);
        }

    }
    catch (Exception ex)
    {
        var error = ex.Message;
    }
}

private async Task Upload_To_Google_Drive(Stream stream, string fileName, string startDate, string endDate)
{
    try
    {
        _logger.LogError($"Uploading {fileName} to Google Drive");
        var service = Get_Service();

        var folderName = $"Bizvoip : {startDate} to {endDate}";
        var folderId = Get_Folder_Id_For(folderName, service);

        var mimeType = "application/vnd.google-apps.spreadsheet";
        var driveFile = new Google.Apis.Drive.v3.Data.File
        {
            Name = fileName,
            MimeType = mimeType,
            Parents = new string[] { folderId }
        };

        var request = service.Files.Create(driveFile, stream, mimeType);
        request.Fields = "*";

        var results = await request.UploadAsync();
    }
    catch (Exception ex)
    {
        _logger.LogError("Failed to upload to Google Drive: "   ex.Message);
        throw;
    }
}

private DriveService Get_Service()
{
    var tokenResponse = new TokenResponse
    {
        AccessToken = _googleDriveOptions.AccessToken,
        RefreshToken = _googleDriveOptions.RefreshToken
    };

    var applicationName = _googleDriveOptions.ApplicationName;
    var username = _googleDriveOptions.Username;

    var apiCodeFlow = new GoogleAuthorizationCodeFlow(new GoogleAuthorizationCodeFlow.Initializer
    {
        ClientSecrets = new ClientSecrets
        {
            ClientId = _googleDriveOptions.ClientId,
            ClientSecret = _googleDriveOptions.ClientSecret
        },
        Scopes = new[] { Scope.Drive },
        DataStore = new FileDataStore(applicationName)
    });

    var credential = new UserCredential(apiCodeFlow, username, tokenResponse);

    var service = new DriveService(new BaseClientService.Initializer
    {
        HttpClientInitializer = credential,
        ApplicationName = applicationName
    });

    return service;
}

 

При запросе на загрузку мне выдается следующая ошибка:

 Google.Apis.Requests.RequestError
Bad Request [400]
Errors [
    Message[Bad Request] Location[ - ] Reason[badRequest] Domain[global]
]

 

Конфигурация настроена точно так же, как и в задаче, в которой файлы успешно загружаются.

Любая помощь будет признательна.

Спасибо!

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

1. Первая мысль-удалить Parents = новую строку[] { Идентификатор папки} , чтобы посмотреть, загружается ли она тогда. Вторая мысль, пожалуйста, добавьте свой код авторизации, как вы создаете сервис var service = Get_Service();

2. Происходит ли это только с файлами Excel?

3. @mxmissile да. Я еще не пробовал работать с другими форматами файлов, так как это необходимо только для файлов Excel.

4. Вероятно, следует попробовать другие типы, основные методы устранения неполадок.

Ответ №1:

Итак, после добавления следующей функции :

 private static string GetMimeType(string fileName)
{
    string mimeType = "application/unknown";
    string ext = Path.GetExtension(fileName).ToLower();

    var regKey = Microsoft.Win32.Registry.ClassesRoot.OpenSubKey(ext);
    if (regKey != null amp;amp; regKey.GetValue("Content Type") != null)
    {
        mimeType = regKey.GetValue("Content Type").ToString();
    }

    return mimeType;
}
 

Оказалось, что набор типов mime был неверным. Тип, который я установил, был «приложение/vnd.google-приложения.электронная таблица». Тип mimeType, возвращенный функцией, был «application/vnd.openxmlformats-officedocument.spreadsheetml.sheet». Изменен исходный тип файла, и файл успешно загружен.