繁体   English   中英

无法访问在Web应用程序中创建的文件

[英]Unable to access a file created in a web application

这是我在wcf服务中使用的代码。 它成功生成了PDF,但是在生成文档之后,生成PDF的文件夹给出了错误: “拒绝访问”

对于网站,PDF已关闭,但对于连续Web服务,则未关闭。

string r = builder.ToString();
string pdfname = Fuhre + "_" + ProtokolType + "_" + GeraeteNr + "_" + r;

PdfWriter.GetInstance(document, new FileStream(@"C:\inetpub\wwwroot\protokoll_pdfs\"+pdfname+".pdf",FileMode.Create));
document.Open();
WebClient wc = new WebClient();
string htmlText = html;
//Response.Write(htmlText);
List<IElement> htmlarraylist = HTMLWorker.ParseToList(new StringReader(htmlText), null);
for (int k = 0; k < htmlarraylist.Count; k++)
{
   document.Add((IElement)htmlarraylist[k]);
}

pdflink1 = pdfname + ".pdf";
htmlpdflink =""+pdflink1;
document.Close();

您需要小心处理所有内容。

    using(var filesStream = new FileStream())
    {
        using(PdfWriter wri = PdfWriter.GetInstance(doc, fileStream)) 
        {
    ...
        }
    }

您可能要关闭其他一些对象(Stream,Document)。 下面显示了如何执行该操作的示例。

FileStream stream = new FileStream(filePath, FileMode.CreateNew);            
Document doc = new Document(PageSize.A4, 24, 24, 24, 24);
PdfWriter writer = PdfWriter.GetInstance(doc, stream);

doc.Open();

//PDF writing operations here


writer.Flush();
doc.Close();
writer.Close();
stream.Close();

您想要将文件提供给浏览器和/或要将文件保存在磁盘上。

在这种情况下,您将受益于在内存中创建文件,然后将字节发送到浏览器以及磁盘上的文件。 在以下问题的答案中对此进行了解释: servlet无法正确加载Pdf文件

上面提到的答案是用Java编写的,因此您必须对其进行调整。

您可以通过查看其他示例来做到这一点。 例如: 在内存而不是物理文件中创建PDF

byte [] pdfBytes; using(var mem = new MemoryStream()){using(PdfWriter wri = PdfWriter.GetInstance(doc,mem)){doc.Open(); //打开要写入段落的文档段落= new段落(“这是我的第一行使用段落。”); 短语pharse =新短语(“这是我使用Pharse的第二行。”); 块=新块(“这是我使用块的第三行。”);

    doc.Add(paragraph);

    doc.Add(pharse);

    doc.Add(chunk); 
}
pdfBytes = mem.ToArray();

}

现在,您可以将pdfBytes写入Web应用程序中的Response对象:

private void ShowPdf(byte[] strS)
{
    Response.ClearContent();
    Response.ClearHeaders();
    Response.ContentType = "application/pdf";
    Response.AddHeader("Content-Disposition", "attachment; filename=" + DateTime.Now);

    Response.BinaryWrite(strS);
    Response.End();
    Response.Flush();
    Response.Clear();
}

您可以重复使用字节将它们写入File可以将Byte []数组写入C#中的文件吗?

File.WriteAllBytes(string path, byte[] bytes)

如果问题仍然存在,那么您就知道这不是由iTextSharp引起的,因为iTextSharp仅产生字节。

除了其他人所说的之外,我强烈建议您将每个过程分为多个部分,这些部分不相互影响甚至彼此不了解。 然后,尽可能独立地测试每个部分。 例如:

private void makePDF( filePath )
{
    //Create the PDF
}

private void main()
{
    //Make the PDF
    makePDF( "test.pdf" );

    //If this line fails then your makePDF code has an open handle
    File.Delete( "test.pdf" );
}

然后继续:

private void makePDF( filePath )
{
    //Create the PDF
}

private void emailPDF( filePath )
{
    //Email the PDF
}

private void main()
{
    //Make the PDF
    makePDF( "test.pdf" );
    emailPDF( "test.pdf" );

    //If this line fails now then your emailPDF code has an open handle
    File.Delete( "test.pdf" );
}

如果您不一次尝试500件事,则很重要,因为这会导致“某事锁定了我的文件,但我不知道是什么”。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM