Создание и сохранение файла в опубликованном ASP.Net Core API не работает - PullRequest
0 голосов
/ 03 января 2019

Я пытаюсь создать .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.

...