Se il percorso dove sono i file è fuori dal sito l'unico modo è leggere uno stream da disco andando a puntarlo direttamente,
in C# una cosa del genere:
Questo metodo ritorna un'array di byte che sono il contenuto del file.
Come vedi al metodo devi passare il percorso completo del file da leggere (quindi d:\path\file.pdf per esempio)
codice:
//Metodo che permette di effettuare il download
public static byte[] DownloadFile(System.String m_strFilePath)
{
//Dichiarazione membri interni
System.Byte[] m_byteFile = null;
System.IO.FileStream m_StaticFileStream = null;
try
{
//Recupero i byte del file leggendolo da uno stream
m_StaticFileStream = new FileStream(m_strFilePath, System.IO.FileMode.Open, System.IO.FileAccess.Read);
m_byteFile = new byte[m_StaticFileStream.Length];
m_StaticFileStream.Read(m_byteFile, 0, m_byteFile.Length);
m_StaticFileStream.Close();
//Chiamo le funzionalità per forzare il download
if (m_byteFile.Length > 0)
{
return m_byteFile;
}
else
{
//Rilancio eccezione
throw new Exception("File non trovato.");
}
}
catch
{
//Rilancio eccezione
throw;
}
finally
{
//Stacco oggetto
m_StaticFileStream = null;
}
}
Queti byte li devi leggere da una pagina apposita tipo download.aspx a cui passerai i riferimenti del file.
In questa pagina dovrai forzare gli header http per fare il download
codice:
//Recupero i dati per il download
m_byteFile = Global.Common.FileSystem.FileOperation.DownloadFile(this.FilePath);
//Clear del contesto
HttpContext.Current.Response.Clear();
//Imposto l'header
HttpContext.Current.Response.AddHeader("Content-Disposition", "attachment;filename="+this.FileName.ToString());
HttpContext.Current.Response.AddHeader("Pragma", "public");
HttpContext.Current.Response.AddHeader("Cache-Control","max-age=0");
HttpContext.Current.Response.AddHeader("Content-Length", m_byteFile.Length.ToString());
HttpContext.Current.Response.ContentType = "application/save; name=" + this.FileName;
//Scrittura dei Byte
HttpContext.Current.Response.BinaryWrite(m_byteFile);
HttpContext.Current.Response.Flush();
HttpContext.Current.Response.End();