Le alternative di Risposta.TransmitFile()

Così ho il set di codice ho giocato con per gli ultimi due giorni, ho bisogno di scaricare un file dal server al client. Questa è la parte facile, ma ho anche bisogno di aggiornare la griglia dopo che è finito e visualizzare in un avviso che il file è stato creato con successo, ma in ogni modo che ho trovato per scaricare contiene un selezionare la riga di codice che sarà la mia rovina.

Risposta.Fine()

Risposta.Close() o

ApplicationInstance.CompleteRequest()

Tutti questi fine la risposta corrente o credo in ApplicationInstance caso di vampate di tutto il codice sorgente della pagina e il file di testo che sto cercando di scaricare. A seguito di questo è il frammento di codice che ho per il download di un file dal server, di seguito è riportata la fonte per scaricare il mio file. Se avete qualcosa che può aiutare a risolvere questo interminabile incubo sarebbe molto apprezzato.

            //I brought everything together in an arraylist to write to file.
            asfinalLines = alLines.ToArray(typeof(string)) as string[];

            string FilePath = HttpContext.Current.Server.MapPath("~/Temp/");
            string FileName = "test.txt";

            //Creates the file on server
            File.WriteAllLines(FilePath + FileName, asfinalLines);

            //Prompts user to save file
            System.Web.HttpResponse response = System.Web.HttpContext.Current.Response;
            response.ClearContent();
            response.Clear();
            response.ContentType = "text/plain";
            response.AppendHeader("Content-Disposition", "attachment; filename=" + FileName + ";");
            response.TransmitFile(FilePath + FileName);
            response.Flush();

            //Deletes the file on server
            File.Delete(FilePath + FileName);

            response.Close();

 

One Reply
  1. 2

    Approccio 1: Utilizzando un file temporaneo

    Se si desidera eliminare il file dopo il trasferimento di file o eseguire altre pulire le operazioni si può fare questo

    //generate you file
    //set FilePath and FileName variables
    string stFile = FilePath + FileName;
    try {
        response.Clear();
        response.ContentType = "text/plain";
        response.AppendHeader("Content-Disposition", "attachment; filename=" + FileName + ";");
        response.TransmitFile(stFile);
        response.Flush();
    } catch (Exception ex) {
        //any error handling mechanism
    } finally {
        if (System.IO.File.Exists(stFile)) {
            System.IO.File.Delete(stFile);
        }
        HttpContext.Current.ApplicationInstance.CompleteRequest();
    }

    Approccio 2: Senza salvare i file sul server

    Se il tuo testo è piccola, allora si può seguire un altro (NON utilizzare questo approccio per grandi trasferimenti di dati), è possibile consegnare direttamente il contesto come file di testo per i clienti senza il loro salvataggio sul server

    try {
        //assuming asFinalLines is a string variable
        Response.Clear();
        Response.ClearHeaders();
        Response.AddHeader("Content-Length", asFinalLines.Length.ToString());
        Response.ContentType = "text/plain";
        response.AppendHeader("Content-Disposition", "attachment; filename=" + FileName + ";");
        Response.Write(asFinalLines);
        response.Flush();
    } catch (Exception ex) {
        Debug.Print(asFinalLines);
    } finally {
        HttpContext.Current.ApplicationInstance.CompleteRequest();
    }

    PS: io sono un VB.NET persona, ha cercato di convertire il codice in c# potrebbe avere qualche caso-problemi di sensibilità, ma la logica è chiara come il cristallo

    AGGIORNAMENTO:

    Approccio 3: l’Esecuzione di codice con il trasferimento di file.

    È necessario tenere a mente che non si può avere più risposte ad una richiesta. NON puoi aggiornare la tua pagina e la trasmissione di un file in una sola risposta. Le intestazioni possono essere impostate solo una volta per ogni richiesta.

    In questo caso devi seguire la seguente metodologia:

    • Creare un nuovo Div/Etichetta dove verrà visualizzato un collegamento al file per il download. Mantenere nascosto per impostazione predefinita.
    • Elaborare la richiesta
    • Generare il file richiesto (NON trasmettono di sicurezza, solo per salvare il server)
    • Eseguire altre attività, aggiornare il vostro front-end (cioè aggiorna la griglia, la visualizzazione del messaggio ecc) e anche
    • Fornire un link per il file generato nel nascosta Etichetta e mostrare. (Potete anche usare il vostro messaggio div fornire il link per il download.
    • Su richiesta di download dal link visualizzato nel passaggio precedente trasmettere il file e poi lo si cancella, come menzionato nell’Approccio 1 (NON si rigenerano, solo per trasmettere/elimina).
    • In alternativa, è possibile eliminare il vecchio file, prima che l’elaborazione e la creazione di nuovi file. In questo modo è possibile consentire all’utente di scaricare il file vecchio fino a quando un nuovo file è stato generato. Questo metodo è più adatto per file di grandi dimensioni.

    Questo approccio aggiunge un ulteriore passo per scaricare il file dopo che è stato generato e non il supporto diretto di trasmissione dati, cioè senza risparmio al server.

    • Questo metodo è ancora iscritto l’origine del Asp.NET pagina del file che sto trasmettendo. Anche io sto tentando di aggiornare la pagina o aggiornare la griglia in seguito e utilizzando un redirect alla prova (Come la maggior parte dei risultati evidenti) e non è il reindirizzamento di me.
    • Il contenuto del file che dipenderà dalla vostra linea di codice asfinalLines = alLines.ToArray(typeof(string)) as string[];. Controllare il contenuto di alLines, come si è generato. Controllare anche per i file di text.txt, non contiene i dati effettivi o no?
    • Per quanto riguarda l’esecuzione di codice, ad esempio per aggiornare gridview, la visualizzazione di un messaggio, ecc, è necessario implementare un altro approccio, io aggiornare la mia risposta per il terzo approccio
    • Grazie mille per l’aiuto! Come per il asfinalLines e alLines contenuto, tutto ciò che ha 14 righe che passava le condizioni e quindi anche il file originale. Ma dopo la trasmissione del file che contiene il codice sorgente della pagina, ho potuto solo provare a rimuovere tutto dopo il tag, ma speravo che non avrei dovuto fare un lavoro intorno.
    • Controllare Approccio 3. Per quanto riguarda il tuo problema di codice nel file scaricato, provare altre alternative come OutputStream.Scrivere o di Risposta.BinaryWrite etc. invece di TransmitFile o anche lo stretto collegamento di ancoraggio. In caso contrario, è necessario guardare in codice in cui si desidera generare i dati per il file, è possibile creare un nuovo post per questo problema.

Lascia un commento