.net 拒绝访问WWWRoot文件夹中文件的路径

lmvvr0a8  于 2023-02-17  发布在  .NET
关注(0)|答案(1)|浏览(473)

我试图访问驻留在wwwRoot中的两个文件夹。这些文件夹是“BlankPDFFiles”和“FilledPDFFiles”。我试图获取驻留在BlankPDFFiles文件夹中的空白PDF文件,并在文件中写入一些数据,然后将其保存到FilledPDFFiles文件夹中。这是我的解决方案的结构:

当我尝试访问空白PDF文件时,出现以下错误:

下面是我的代码

public class PDFController : Controller
    {
        private readonly IEmployeeService _employeeService;
        public readonly IConfiguration _configuration;
        public readonly ILogger _logger;
        private readonly IWebHostEnvironment _environment;
        public PDFController(IEmployeeService employeeService, IConfiguration configuration, ILogger<PDFController> logger, IWebHostEnvironment environment)
        {
            _employeeService = employeeService;
            _configuration = configuration;
            _logger = logger;
            _environment = environment;
        }

        public async Task<IActionResult> Index()
        {
          
            await PopulatePDFDoc();
            return View();
        }

  public  async Task PopulatePDFDoc()
        {
            AckPackage.Data.PDFPopulate.DocPDF doc = new Data.PDFPopulate.DocPDF();
            string pdfLic = _configuration["PDFLicense"].ToString();
            string filledPDF = Path.Combine(_environment.WebRootPath, "FilledPDFFiles");
            string blankPDF = Path.Combine(_environment.WebRootPath, "BlankPDFFiles");
            EmployeeInfo employee =  await _employeeService.GetEmployeeByEmployeeNumber(up.EmployeeId);
            await doc.popolatePDFDoc(pdfLic, filledPDF, blankPDF, employee);

        }

这是我在populatePDFDoc方法中的内容:

public async Task  popolatePDFDoc(string PDFLic, string filledPDF, string blankPDF, EmployeeInfo employee)
        {
            
            string pathToFile = filledPDF + "_Package"+ "_" + employee.EmployeeNumber;
            bool validLicense = BitMiracle.Docotic.LicenseManager.HasValidLicense;
           
            **using (PdfDocument pdf = new PdfDocument(blankPDF))**
            {
                foreach (PdfControl control in pdf.GetControls())
                {
                    switch (control.Name)
                    {
                        case "EmpID":
                            ((PdfTextBox)control).Text = employee.EmployeeNumber;
                            break;
                        case "Last Name":
                            ((PdfTextBox)control).Text = employee.LastName;
                            break;
                    }
                }
                pdf.Save(pathToFile);
            }

我在popolatePDFDoc中的此行收到错误

using (PdfDocument pdf = new PdfDocument(blankPDF))

我正在使用第三方供应商工具来填充PDF文件。

jvlzgdj9

jvlzgdj91#

这与PDF库供应商无关,可能是因为您的Web应用程序的exe是从blankPDF指向的路径之外的目录运行的。
通过在异常发生之前的某个地方调用Environment.CurrentDirectory并在其上放置断点来查看它,可以查看应用程序运行的目录。
如果您正在本地开发并遇到此错误,则应用程序可能正在文件夹C:\AllITProjects\AckPackage\bin\Debug\net7.0中运行。
wwwroot文件夹并不总是可以从应用程序写入,这取决于您运行应用程序的方式。但是,项目文件夹总是可以写入的,因为项目文件夹是应用程序exe所在的位置。因此,以下是将PDF文件夹移动到项目文件夹的步骤,这将确保它们保持可写状态:

1.将BlankPDFFilesFilledPDFFiles文件夹从wwwroot文件夹中移出,并移入项目文件夹(.csproj文件所在的文件夹)。
2.在记事本中打开.csproj文件,并添加以下行,告诉编译器在编译时复制PDF文件夹:

<ItemGroup>
    <None Include="BlankPDFFiles\**" CopyToOutputDirectory="Always" CopyToPublishDirectory="Always" />
    <None Include="FilledPDFFiles\**" CopyToOutputDirectory="Always" CopyToPublishDirectory="Always" />
</ItemGroup>

3.将filledPDFblankPDF更改为使用_environment.ContentRootPath

string filledPDF = Path.Combine(_environment.ContentRootPath, "FilledPDFFiles");
string blankPDF = Path.Combine(_environment.ContentRootPath, "BlankPDFFiles");

4.您必须在专门为filledPDF路径中的PDF提供服务的控制器中创建一个操作,因为它将不再驻留在wwwroot文件夹中。

如果您需要更多帮助,尤其是步骤4,请告诉我。

相关问题