【发布时间】: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