2013-08-01 4 views
0

En fait, j'ai enregistré un fichier dans BinaryData dans Sql et maintenant je suis en mesure de télécharger ce fichier en convertissant le BinaryData en Bytes.Demande d'enregistrement de fichier sur le disque

Mon code est:

object value = (sender as DevExpress.Web.ASPxGridView.ASPxGridView).GetRowValues(e.VisibleIndex, "ID"); 
        Int64 FileID = Convert.ToInt64(value); 

        var filedata = (from xx in VDC.SURVEY_QUESTION_REPLIES 
            where xx.ID == FileID 
            select xx).FirstOrDefault(); 

        string fileextension = filedata.FILE_EXTENSION.ToString(); 
        string fileName = filedata.ANSWER_TEXT.ToString() + fileextension; 

        string DocumentName = null; 
        FileStream FStream = null; 
        BinaryWriter BWriter = null; 
        byte[] Binary = null; 
        const int ChunkSize = 100; 
        int SizeToWrite = 0; 
        MemoryStream MStream = null; 

        DocumentName = fileName; 

        FStream = new FileStream(@"c:\\" + DocumentName, FileMode.OpenOrCreate, FileAccess.Write); 
        BWriter = new BinaryWriter(FStream); 
        Binary = (filedata.FILE_DATA) as byte[]; 
        SizeToWrite = ChunkSize; 
        MStream = new MemoryStream(Binary); 

        for (int i = 0; i < Binary.GetUpperBound(0) - 1; i = i + ChunkSize) 
        { 
         if (i + ChunkSize >= Binary.Length) SizeToWrite = Binary.Length - i; 
         byte[] Chunk = new byte[SizeToWrite]; 
         MStream.Read(Chunk, 0, SizeToWrite); 
         BWriter.Write(Chunk); 
         BWriter.Flush(); 
        } 
        BWriter.Close(); 
        FStream.Close(); 
        FStream.Dispose(); 
        System.Diagnostics.Process.Start(@"c:\" + DocumentName); 

et sauve directement le fichier à l'emplacement C Drive. Maintenant, My Requirement est que, je dois obtenir une invite pour enregistrer ce fichier et l'utilisateur doit sélectionner l'emplacement d'enregistrement. Est-ce possible?

Répondre

2

Vous créez un filestream avec un emplacement fixe ici:

FStream = new FileStream(@"c:\\" + DocumentName, FileMode.OpenOrCreate, FileAccess.Write); 

Qu'est-ce que vous avez à faire est quelque chose comme ceci:

var dialog = new SaveFileDialog(); 
if (dialog.ShowDialog() == DialogResult.OK) 
{ 
    FStream = new FileStream(dialog.FileName, FileMode.OpenOrCreate, FileAccess.Write); 
    // put the rest of your file saving code here 
} 

N'oubliez pas d'importer l'espace de noms Forms

using System.Windows.Forms; 
+0

En donnant une erreur comme celle-ci: Le thread en cours doit être réglé en mode STA (Single Thread Apartment) avant que les appels OLE puissent être effectués. Assurez-vous que votre fonction Main a STAThreadAttribute marqué dessus. Cette exception n'est levée que si un débogueur est attaché au processus. – RealSteel

+0

@RealSteel Justs ajouter l'annotation '[STAThread]' sur votre méthode principale, voir http://stackoverflow.com/questions/6373645/c-sharp-winforms-how-to-set-main-function-stathreadattribute pour plus d'informations – derape

0

Si son application Forms Vous pouvez utiliser la classe SaveFileDialog

0

il est possible,

vous pouvez utiliser un SaveFileDialog que vous créez dans votre concepteur et appeler la méthode "show" pour ouvrir cette boîte de dialogue:

private void button1_Click(object sender, System.EventArgs e) 
{ 
    Stream myStream ; 
    SaveFileDialog saveFileDialog1 = new SaveFileDialog(); 

    saveFileDialog1.Filter = "txt files (*.txt)|*.txt|All files (*.*)|*.*" ; 
    saveFileDialog1.FilterIndex = 2 ; 
    saveFileDialog1.RestoreDirectory = true ; 

    if(saveFileDialog1.ShowDialog() == DialogResult.OK) 
    { 
     if((myStream = saveFileDialog1.OpenFile()) != null) 
     { 
      // Code to write the stream goes here. 
      myStream.Close(); 
     } 
    } 
} 

Source: http://msdn.microsoft.com/en-gb/library/system.windows.forms.savefiledialog.aspx

0

I voir que vous utilisez des composants Web de DevExpress, donc en supposant que vous voulez envoyer le flux à la réponse pour le client pour enregistrer le fichier.

S'il s'agit d'une application ASP.NET MVC, vous pouvez renvoyer FileContentResult en tant que résultat d'action directement. Dans le cas contraire, vous pouvez utiliser l'exemple suivant l'adaptation dans votre code

Response.ContentType = "application/octet-stream"; 
Response.AddHeader("Content-Disposition", "attachment; filename=" + DocumentName); 
MStream.WriteTo(Response.OutputStream); 

En fonction des paramètres du navigateur de l'utilisateur, dialogue de sauvegarde de fichier peut être affiché à l'utilisateur.

Questions connexes