【问题标题】:Access to the path is denied - different from user拒绝访问路径 - 与用户不同
【发布时间】:2015-06-10 13:19:37
【问题描述】:

我在 ASP.Net 和 C# 中有一个网页。此页面显示了一个包含我们订单的表格。然后供应商需要检查数据并保存。

我的问题: 当供应商点击“保存”时,会下载一个 PDF。我们有超过 100 家供应商使用这个网站,它适用于我们 98% 的供应商。但是 3 个供应商在点击“保存”时出现错误信息:

对路径“C:\ExterneData\PDF\F000001.pdf”的访问被拒绝。

这是用于访问 PDF 的代码:

// Save the document...
string filename = Server.MapPath("~/PDF/" + Url_SupplierId + ".pdf");
document.Save(filename);

string path = filename;
string name = Url_SupplierId + ".pdf";

FileStream fs = new FileStream(path, FileMode.Open, FileAccess.Read);

// Create a byte array of file stream length
byte[] _downFile = new byte[fs.Length];

//Read block of bytes from stream into the byte array
fs.Read(_downFile, 0, System.Convert.ToInt32(fs.Length));

//Close the File Stream
fs.Close();
Session["PDFControl"] = _downFile;
Session["PDFControlName"] = Url_SupplierId + "_" + Url_PurchId + ".pdf";

if (File.Exists(filename))
   File.Delete(filename);

byte[] _downFile2 = Session["PDFControl"] as byte[];
Session["PDFControl"] = null;

Response.Clear();
Response.ClearContent();
Response.ClearHeaders();
Response.ContentType = "application/pdf";
Response.AddHeader("Content-Disposition", "attachment; filename=" + Session["PDFControlName"] + "; size=" + _downFile2.Length.ToString());
Response.BinaryWrite(_downFile2);
Response.Flush();
Response.End();

我不明白的是这条消息显示了一些访问权限错误。但它适用于我和我们 98% 的供应商。所以错误不是来自服务器?

【问题讨论】:

  • 我没有看到要存储的文件夹被声明在哪里,但是您是否确保该文件夹存在,如果不存在,请创建它?
  • 文件夹为:Server.MapPath("~/PDF/" + Url_SupplierId + ".pdf")。因为我的项目在 C:\ExterneData 上。确实,我不测试文件夹是否存在。但是,如果这个不存在,我将不会有 UnauthorizedAccessException (我实际上拥有的访问被拒绝)。
  • 啊,抱歉我误会了,PDF 是保存在他们的 PC 上还是远程服务器上?无论如何,这对我来说听起来像是一个权限问题。我会确保他们可以先看到该文件夹​​并从那里开始。
  • 代码正在执行类似这样的操作:用户单击保存 -> 创建 PDF -> PDF 保存在 C:\ExterneData\PDF_SupplierId_.pdf -> PDF 文件转换为字节数组 -> PDF 文件已删除 -> 用户下载字节数组。
  • 你的认证方式是什么?您是否在 web.config 中使用模拟标签?也许 asp.net 进程使用您的用户权限?

标签: c# asp.net pdf download


【解决方案1】:

如果您的所有权限都正确,那么我能想到的唯一想法就是尝试不同的方式(这些供应商的 PDF 是否比其他供应商更大?)。我认为不需要在这里创建 2 字节数组或使用会话变量。也许是这样的:

// Save the document...
string filename = Server.MapPath("~/PDF/" +  Url_SupplierId + ".pdf");
document.Save(filename);


using (FileStream fs = new FileStream(filename, FileMode.Open, FileAccess.Read))
  {
    // Create a byte array of file stream length
    byte[] _downFile  = new byte[fs.Length];

    int numBytesToRead = (int)fs.Length;
    int numBytesRead = 0;

    //Read block of bytes from stream into the byte array
    while (numBytesToRead > 0)
      {
        // Read may return anything from 0 to numBytesToRead. 
        int n = fs.Read(_downFile, numBytesRead, numBytesToRead);

        // Break when the end of the file is reached. 
        if (n == 0)
          break;

        numBytesRead += n;
        numBytesToRead -= n;
      }
    numBytesToRead = _downFile.Length;
  }

if (File.Exists(filename))
 File.Delete(filename);

Response.Clear();
Response.ClearContent();
Response.ClearHeaders();
Response.ContentType = "application/pdf";
Response.AddHeader("Content-Disposition", "attachment; filename=" + Path.GetFileName(filename) + "; size=" + numBytesToRead);
Response.BinaryWrite(_downFile);
Response.Flush();
Response.End();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-11-11
    • 2011-03-29
    • 1970-01-01
    • 1970-01-01
    • 2010-09-24
    相关资源
    最近更新 更多