#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». Изменен исходный тип файла, и файл успешно загружен.