【问题标题】:File not uploading to Google Drive using Google.Apis.Drive.v3.DriveService文件未使用 Google.Apis.Drive.v3.DriveService 上传到 Google Drive
【发布时间】:2021-09-21 13:36:24
【问题描述】:

我正在努力解决我的 excel 文件不想上传到 Google 云端硬盘的问题。我在另一个 hangfire 任务中使用这个包,并且这些文件成功上传。我正在使用 ClosedXml 构建一个 excel 文件。我还用我手动创建的现有 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]
]

配置的设置与文件上传成功的任务完全相同。

任何帮助将不胜感激。

谢谢!

【问题讨论】:

  • 首先想到的是删除 Parents = new string[] { folderId } 看看它是否上传。第二个想法是请添加您的授权代码您如何创建服务 var service = Get_Service();
  • 这种情况只发生在 Excel 文件中吗?
  • @mxmissile 是的。我还没有尝试过其他文件格式,因为只需要 excel 文件。
  • 应该可以试试其他类型,基本排错。

标签: c# google-drive-api .net-5 closedxml


【解决方案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 && regKey.GetValue("Content Type") != null)
    {
        mimeType = regKey.GetValue("Content Type").ToString();
    }

    return mimeType;
}

事实证明,mime 类型设置不正确。我设置的 mimeType 是“application/vnd.google-apps.spreadsheet”。从函数返回的 mimeType 是“application/vnd.openxmlformats-officedocument.spreadsheetml.sheet”。更改了原来的mimeType,文件上传成功。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-03-10
    • 2015-09-13
    • 2012-12-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多