2015-06-10 4 views
0

У меня есть веб-страница в 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% наших поставщиков. Итак, ошибка не исходит от сервера?

+0

Я не вижу, где была записана папка, в которую она будет храниться, но убедитесь, что папка существует, а если нет, создайте ее? – bkribbs

+0

Папка: Server.MapPath ("~/PDF /" + Url_SupplierId + ".pdf"). Потому что мой проект находится на C: \ ExterneData. И это правда, я не проверяю, существует ли папка. Но если этого не существует, у меня не будет исключения UnauthorizedAccessException (что у меня на самом деле есть с отказом доступа). – Phobie

+0

Ах, извините, я думаю, что неправильно понял, PDF сохраняется на их ПК или на удаленном сервере? Несмотря на это, это звучит как вещь с разрешениями для меня. Я бы удостоверился, что они могут сначала увидеть папку и перейти оттуда. – bkribbs

ответ

0

Если у вас есть все права на правильность, то единственное, о чем я могу думать, это попробовать по-другому (у этих поставщиков большие 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(); 
Смежные вопросы