Question

J'utilise actuellement une HTTPresponse pour télécharger des fichiers de mon serveur.J'ai déjà quelques fonctions utilisées pour télécharger des fichiers Excel / Word, mais j'ai des difficultés à obtenir mon fichier texte simple (.txt) à télécharger.

Avec le fichier texte, je suis fondamentalement dumping du contenu d'une zone de texte dans un fichier, essayant de télécharger le fichier avec le HTTPResponse, puis supprimez le fichier texte temporaire.

Voici un exemple de mon code qui fonctionne pour les documents Excel / Word:

protected void linkInstructions_Click(object sender, EventArgs e)
{
    String FileName = "BulkAdd_Instructions.doc";
    String FilePath = Server.MapPath("~/TempFiles/BulkAdd_Instructions.doc");
    System.Web.HttpResponse response = System.Web.HttpContext.Current.Response;
    response.ClearContent();
    response.Clear();
    response.ContentType = "application/x-unknown";
    response.AddHeader("Content-Disposition", "attachment; filename=" + FileName + ";");
    response.TransmitFile(FilePath);
    response.Flush();
    response.End();  
}

Et voici le morceau du code qui ne fonctionne pas.
Notez que le code fonctionne sans lancer d'erreurs.Le fichier est créé et supprimé, mais jamais jeté à l'utilisateur.

protected void saveLog(object sender, EventArgs e)
{ 
    string date = DateTime.Now.ToString("MM_dd_yyyy_hhmm");     //  Get Date/Time
    string fileName = "BulkLog_"+ date + ".txt";                //  Stitch File Name + Date/Time
    string logText = errorLog.Text;                             //  Get Text from TextBox
    string halfPath = "~/TempFiles/" + fileName;                //  Add File Name to Path
    string mappedPath = Server.MapPath(halfPath);               //  Create Full Path

    File.WriteAllText(mappedPath, logText);                     //  Write All Text to File

    System.Web.HttpResponse response = System.Web.HttpContext.Current.Response;
    response.ClearContent();
    response.Clear();
    response.ContentType = "text/plain";
    response.AddHeader("Content-Disposition", "attachment; filename=" + fileName);
    response.TransmitFile(mappedPath);                //  Transmit File
    response.Flush();

    System.IO.File.Delete(mappedPath);                //  Delete Temporary Log
    response.End();
}

Était-ce utile?

La solution 5

J'ai fini par résoudre le problème seul.Il s'avère que c'était un problème Ajax ne permettant pas à mon bouton de poster correctement.Cela a arrêté le transmetteur d'être tiré.

Merci pour l'aide!

Autres conseils

C'est parce que vous supprimez le fichier avant de pouvoir envoyer.

de msdn - httpresponse.end la méthode

envoie toutes les sorties tamponnées actuellement à le client, arrête l'exécution de la page, et soulève l'événement EndRequest.

Essayez de mettre votre système.file.file.delete (MappedPath);ligne après la réponse.end ();Dans mon test, il semblait alors de travailler.

En outre, une bonne idée peut être une bonne idée de vérifier si le fichier existe d'abord, je ne peux voir aucun fichier.exists de là, ne voulez pas d'exceptions de référence NULLL et de définir la longueur du contenu.

Edit: Voici le code que j'ai utilisé dans un projet au travail il y a un moment, pourrait vous aider à sortir un peu.

// Get the physical Path of the file
string filepath = System.Web.Hosting.HostingEnvironment.ApplicationPhysicalPath + folder + filename;

// Create New instance of FileInfo class to get the properties of the file being downloaded
FileInfo file = new FileInfo(filepath);

// Checking if file exists
if (file.Exists)
{                            
    // Clear the content of the response
    Response.ClearContent();

    // LINE1: Add the file name and attachment, which will force the open/cance/save dialog to show, to the header
    Response.AddHeader("Content-Disposition", String.Format("attachment; filename={0}", file.Name));

    // Add the file size into the response header
    Response.AddHeader("Content-Length", file.Length.ToString());

    // Set the ContentType
    Response.ContentType = ReturnFiletype(file.Extension.ToLower());

    // Write the file into the response (TransmitFile is for ASP.NET 2.0. In ASP.NET 1.1 you have to use WriteFile instead)
    Response.TransmitFile(file.FullName);

    // End the response
    Response.End();

    //send statistics to the class
}

Et voici la méthode FileType que j'ai utilisée

//return the filetype to tell the browser. 
//defaults to "application/octet-stream" if it cant find a match, as this works for all file types.
public static string ReturnFiletype(string fileExtension)
{
    switch (fileExtension)
    {
        case ".htm":
        case ".html":
        case ".log":
            return "text/HTML";
        case ".txt":
            return "text/plain";
        case ".doc":
            return "application/ms-word";
        case ".tiff":
        case ".tif":
            return "image/tiff";
        case ".asf":
            return "video/x-ms-asf";
        case ".avi":
            return "video/avi";
        case ".zip":
            return "application/zip";
        case ".xls":
        case ".csv":
            return "application/vnd.ms-excel";
        case ".gif":
            return "image/gif";
        case ".jpg":
        case "jpeg":
            return "image/jpeg";
        case ".bmp":
            return "image/bmp";
        case ".wav":
            return "audio/wav";
        case ".mp3":
            return "audio/mpeg3";
        case ".mpg":
        case "mpeg":
            return "video/mpeg";
        case ".rtf":
            return "application/rtf";
        case ".asp":
            return "text/asp";
        case ".pdf":
            return "application/pdf";
        case ".fdf":
            return "application/vnd.fdf";
        case ".ppt":
            return "application/mspowerpoint";
        case ".dwg":
            return "image/vnd.dwg";
        case ".msg":
            return "application/msoutlook";
        case ".xml":
        case ".sdxl":
            return "application/xml";
        case ".xdp":
            return "application/vnd.adobe.xdp+xml";
        default:
            return "application/octet-stream";
    }
}

J'ai trébuché sur ce post dans ma recherche et remarqua que ce n'était pas utile pour nous dire pourquoi l'UpdatePanel a provoqué la question de la première place.

L'UpdatePanel est un post-pack asynchrone et une réponse .TransMitFile a besoin d'un post-plan complet pour fonctionner correctement.

Le contrôle qui déclenche le post-planche asynchrone doit être effectué une gâchette dans le Panneau Update:

<Triggers>        
<asp:PostBackTrigger ControlID="ID_of_your_control_that_causes_postback" />
</Triggers>

Merci pour le suivi de votre problème.J'ai passé des heures à essayer de comprendre pourquoi aucun code d'erreur n'a été lancé malgré le fait que rien ne s'est passé.S'avère que c'était mon ajax updatepanel mystérieusement et secrètement de la route.

Essayez également Ce pour enregistrer le texte sur le côté du client (chrome seulementmaintenant) sans le tour rond au serveur.

ici est une autre base flash ...

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top