Я пытаюсь создать .Net Core API, который конвертирует загруженный файл в pdf, используя google drive API (docx, excel и т. Д.) И iTextSharp (png, jpeg и т. Д.). Сначала я загружаю файл на сервер, и он сохраняется в каталогах сервера, затем я беру этот файл для преобразования в PDF (с помощью Drive API или iTextSharp) и сохраняю в ту же папку, но он не работает, и нет ошибок. Когда я проверил его на локальном хосте, он работал просто отлично. Вот код:
public async System.Threading.Tasks.Task DriveExcelAsync(string pathupload, string download, string filename, string ext)
{
// UserCredential credential;
string serviceAccountEmail = "myaccount@myaccount-api.im.gserviceaccount.com";
var certificate = new X509Certificate2(Path.Combine(Directory.GetCurrentDirectory(), "key.p12"), "secret", X509KeyStorageFlags.Exportable);
ServiceAccountCredential credential = new ServiceAccountCredential(
new ServiceAccountCredential.Initializer(serviceAccountEmail)
{
Scopes = new[] { DriveService.Scope.Drive }
}.FromCertificate(certificate));
// Create Drive API service.
var service = new DriveService(new BaseClientService.Initializer()
{
HttpClientInitializer = credential,
ApplicationName = ApplicationName,
});
string mime = "";
string reqstream = "";
if (ext == ".xls" || ext == ".xlsx")
{
mime = "application/vnd.google-apps.spreadsheet";
reqstream = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet";
}
else if (ext == ".doc" || ext == ".docx")
{
mime = "application/vnd.google-apps.document";
reqstream = "application/vnd.openxmlformats-officedocument.wordprocessingml.document";
}
var fileMetadata = new Google.Apis.Drive.v3.Data.File()
{
Name = filename,
MimeType = mime
};
FilesResource.CreateMediaUpload request;
using (var stream1 = new System.IO.FileStream(pathupload,
System.IO.FileMode.Open))
{
request = service.Files.Create(
fileMetadata, stream1, reqstream);
request.Fields = "id";
request.Upload();
request.Resume();
}
var file = request.ResponseBody;
Console.WriteLine("File ID: " + file.Id);
//DOWNLOAD FILE
var fileId = file.Id;
var request1 = service.Files.Export(fileId, "application/pdf");
var streamdownload = new System.IO.MemoryStream();
request1.MediaDownloader.ProgressChanged +=
(IDownloadProgress progress) =>
{
switch (progress.Status)
{
case DownloadStatus.Downloading:
{
Console.WriteLine(progress.BytesDownloaded);
break;
}
case DownloadStatus.Completed:
{
Console.WriteLine("Download complete.");
using (FileStream fileOutp = new FileStream(download, FileMode.Create, FileAccess.Write))
{
streamdownload.WriteTo(fileOutp);
}
break;
}
case DownloadStatus.Failed:
{
Console.WriteLine("Download failed.");
break;
}
}
};
request1.Download(streamdownload);
}
public async void ConvertToPdf(string filePath, string filename)
{
string ext = Path.GetExtension(filePath).ToLower();
object paramSourcePath = filePath;
object paramMissing = Type.Missing;
string paramExportFilePath = Path.Combine(Directory.GetCurrentDirectory(), "File", filename + ".pdf");
try
{
await DriveExcelAsync(filePath, paramExportFilePath, filename, ext);
if (ext == ".doc" || ext == ".docx" || ext == ".xls" || ext == ".xlsx")
{
await DriveExcelAsync(filePath, paramExportFilePath, filename, ext);
}
else if (ext == ".jpg" || ext == ".jpeg" || ext == ".png")
{
iTextSharp.text.Rectangle pageSize = null;
using (var srcImage = new Bitmap(filePath))
{
pageSize = new iTextSharp.text.Rectangle(0, 0, srcImage.Width, srcImage.Height);
}
using (var ms = new MemoryStream())
{
var document = new iTextSharp.text.Document(pageSize, 0, 0, 0, 0);
PdfWriter.GetInstance(document, ms).SetFullCompression();
document.Open();
var image = iTextSharp.text.Image.GetInstance(filePath);
document.Add(image);
document.Close();
System.IO.File.WriteAllBytes(paramExportFilePath, ms.ToArray());
}
}
}catch(Exception e)
{
throw e;
}
}
Я думаю, что часть, которая должна сохранять преобразованный файл, по какой-то причине не работает после публикации проекта. Кто-нибудь знает, как это решить? Благодарю.
UPDATE
Попробовав многое, я, наконец, могу заставить его работать, переместив опубликованный проект в другой домен / сайты, использующие другой идентификатор пула приложений IIS. Но я все еще не знаю, почему он не работает на предыдущих доменах / сайтах, я думаю, что это связано с разрешением удостоверения пула приложений IIS.