2008-12-03 6 views
6

J'ai une base de données SQL qui stocke certains documents.C# ASP.NET 3.5 problèmes de téléchargement de fichiers de disposition de contenu

Un utilisateur peut se connecter à l'application et afficher une liste de ses documents. Lorsque vous cliquez sur un bouton de téléchargement dans une grille de leurs documents, j'obtiens le fichier de la base de données, je l'écris dans le système de fichiers, puis j'exécute ce code.

System.IO.FileInfo file = new System.IO.FileInfo(System.Configuration.ConfigurationManager.AppSettings["UploadPath"] + DocumentName); 

    Response.Clear(); 
    Response.ClearContent(); 
    Response.ClearHeaders(); 
    Response.Cookies.Clear(); 
    Response.Cache.SetCacheability(HttpCacheability.Private); 
    Response.CacheControl = "private"; 
    Response.Charset = System.Text.UTF8Encoding.UTF8.WebName; 
    Response.ContentEncoding = System.Text.UTF8Encoding.UTF8; 
    Response.AppendHeader("Content-Length", file.Length.ToString()); 
    Response.AppendHeader("Pragma","cache"); 
    Response.AppendHeader("Expires", "60"); 
    Response.ContentType = GetContentType(file.Extension); 
    Response.AppendHeader("Content-Disposition", 
    "inline; " + 
    "filename=\"" + file.Name + "\"; " + 
    "size=" + file.Length.ToString() + "; " + 
    "creation-date=" + DateTime.Now.ToString("R") + "; " + 
    "modification-date=" + DateTime.Now.ToString("R") + "; " + 
    "read-date=" + DateTime.Now.ToString("R")); 

méthode Mon getContentType() retourne juste le type de fichier approprié pour les fichiers que je suis permettant « application/pdf, application/msw0rd, etc.

Mon problème est que lorsque le fichier est enregistré, c'est la page web elle-même, pas le fichier du système de fichiers, et dans google chrome, ça met une extension .htm à la fin du nom de fichier, je suppose parce qu'il sait que c'est une page web? étape serait d'obtenir le fichier réel, et non une copie de la page Web en HTML, ils sont assis sur!

Merci.

Répondre

9

Comment allez-vous envoyer le contenu réel du fichier ??

I utilise généralement Response.TransmitFile méthode, il ouvre essentiellement le fichier et envoie son contenu à la Response.OutputStream

3

Avez-vous essayé de définir la disposition de contenu sur "pièce jointe" plutôt que "en ligne"? Je crois que le navigateur invitera alors l'utilisateur à ouvrir ou enregistrer le document. En outre, vous pouvez généralement contourner le système de fichiers en écrivant votre flux d'octets directement depuis la base de données vers l'objet Response avec la méthode BinaryWrite ... C'est également un cas où vous voudrez peut-être rechercher un gestionnaire HTTP à la place. une page ASPX pour que vous n'ayez pas à vous inquiéter d'effacer la réponse, etc. J'ai déjà eu du succès en utilisant un iframe caché sur la page, puis en utilisant Javascript pour définir son src à un gestionnaire HTTP qui prend le document ID en tant que paramètre sur QueryString.

9

Au lieu de

Response.AppendHeader ("Content-Disposition", "en ligne," + "filename =

utilisation

Response.AddHeader (" content-disposition: », « attachement; filename =

Questions connexes