2010-11-05 6 views
3

Dans mon application ASP.NET MVC, je génère des rapports Excel, j'ai un fichier modèle que je copie et modifie. Ce fichier modèle est placé dans un dossier de ma solution. Je veux l'utiliser comme suit:accéder à un fichier sur le serveur dans ASP.NET MVC

string templatePath = @"\Templates\report.xlsx"; 

using (var template = File.OpenRead(templatePath)) { 
    // Copy template and process content 
} 

Mais ce code génère une exception

Couldnot find a part of the path 'C:\Templates\report.xlsx'. 

Comment dois-je faire référence à ce dossier?

J'ai aussi essayé d'utiliser

string templatePath = @"~\Templates\report.xlsx"; 

Mais cela aboutit à

Could not find a part of the path 'C:\Program Files\Common Files\Microsoft Shared\DevServer\10.0\~\Templates\report.xlsx'. 

Il fonctionne cependant lorsque j'utilise le chemin absolu, mais qui n'a pas de sens à mon serveur de production.

+1

Si vous utilisez le tilde dans le chemin, il est important d'appeler 'Server.MapPath' sur la chaîne pour le résoudre. – Jess

Répondre

8

Je crois que vous le feriez de la manière ASP.NET normale, en supposant que Templates est un répertoire dans votre application Web.

string templatePath = @"~\Templates\report.xlsx"; 

using (var template = File.OpenRead(Server.MapPath(templatePath))) { 
    // Copy template and process content 
} 
+0

Qu'en est-il de l'essayer de cette façon 'Server.MapPath ("/Templates/report.xlsx ")' ...? Accrochez-vous ... vous venez de supprimer votre commentaire en disant que cela n'a pas fonctionné. L'a fait? – Charlino

+0

Je n'ai pas très bien lu sa réponse au début. Il l'a mis dans le 'File.OpenRead()'. Mettre cette déclaration sur le devoir est un code plus propre à mon avis, mais c'est une saveur personnelle. – Jan

0

Vous devez utiliser Server.MapPath (chemin)

string templatePath = Server.MapPath("~/Templates/report.xlsx"); //Note the forward slashes instead of backslashes. 

using (var template = File.OpenRead(templatePath)) { 
    // Copy template and process content 
} 

Ce tracera le chemin du répertoire virtuel pour le chemin complet sur le serveur.

+0

backslashes travail pour moi, pouvez-vous expliquer pourquoi les barres obliques sont mieux? – Jan

+0

Devinez je ne l'ai jamais essayé avec des barres obliques arrière. Les barres obliques arrière représentent généralement un chemin physique réel tandis que les barres obliques représentent le répertoire virtuel qui héberge votre application. Server.MapPath() prend un répertoire virtuel sur le même serveur et le mappe sur son chemin physique complet. Peut-être que c'est assez intelligent pour savoir ce que vous avez l'intention de faire et c'est pourquoi les backslashes fonctionnent. Je ne suis pas entièrement sûr. – Chev

+0

Je parie que je sais pourquoi cela fonctionne. Templates \ report.xlsx est un sous-répertoire physique de votre répertoire virtuel racine, donc cela fonctionne. Cependant, je parie que si le répertoire Templates était seulement un sous-répertoire virtuel de votre répertoire virtuel racine et que le répertoire physique était ailleurs, les backslashes ne fonctionneraient pas. Je devrais tester cela un jour. Si c'est le cas, je recommanderais toujours des barres obliques au cas où vous auriez besoin de déplacer la structure de votre répertoire tout en laissant vos répertoires virtuels identiques. – Chev