2016-09-08 3 views
0

Ich habe ein Problem. Ich habe docx Datei als Byte-Array in der Datenbank gespeichert. Ich brauche eine URL dieser Datei. Url sollte wie http://my-site.com sein ... aber ich habe keine Ahnung, wie ich es erreichen könnte. Ich lese viele Themen mit Memorystream, Filestream usw. Aber ich verstehe immer noch nicht, wie ich das erreichen kann. Ich schreibe in ASP MVC C#.Wie URL aus Bytes Array erhalten?

+0

Ich denke du meinst Die URL befindet sich im Dokument? Nicht sehr effizient, aber wenn Sie nicht viel über Bytes verstehen, können Sie das Dokument einfach in eine Zeichenfolge konvertieren und dann mit Methoden suchen, die Sie verwenden können. http://stackoverflow.com/questions/11654562/how-convert-byte-array-to-string –

Antwort

3

Für den ASP.NET MVC-Teil können Sie die File-Methode des Controllers verwenden, um ein Byte-Array als Dateidownload zurückzugeben, wie in diesem Beispiel.

public class HomeController : Controller 
{   
    public ActionResult Download(string id) 
    { 
     byte[] fileInBytes = GetFileDataFromDatabase(id); 

     return File(fileInBytes, "application/vnd.openxmlformats-officedocument.wordprocessingml.document", 
      id + ".docx"); 
    } 

    private byte[] GetFileDataFromDatabase(string id) 
    { 
     // your code to access the data layer 

     return byteArray; 
    } 
} 

Die URL wäre: http://.../home/download/{someId}

+0

Sollte ich in der Lage sein, eine Datei nach dem Download herunterzuladen? Ich habe keine Ergebnisse. Wie erhalten Sie diese URL? Sorry für blöde Fragen, aber die Arbeit mit Dateien ist sehr schwierig für mich. – smile

+0

Ich habe gerade mein Beispiel mit der URL (nach dem Standard-MVC-Routing) http: // localhost: .../home/download/1234 ausgeführt und der Browser hat mir einen Download-Dialog aufgefordert. Aber das ist nur ein Beispiel - bitte poste etwas Code deines Controllers, wenn es nicht funktioniert. –

1

Etwas wie folgt aus:

[HttpGet] 
[Route("file/{fileId}")] 
public HttpResponseMessage GetPdfInvoiceFile(string fileId) 
     { 
      var response = Request.CreateResponse(); 
      //read from database 
      var fileByteArray= ReturnFile(fileId); 
      if (fileByteArray == null) throw new Exception("No document found"); 
       response.StatusCode = HttpStatusCode.OK; 
       response.Content = new StreamContent(new MemoryStream(fileByteArray)); 
       response.Headers.Add("Access-Control-Expose-Headers", "Content-Disposition"); 
       response.Content.Headers.ContentDisposition = new ContentDispositionHeaderValue("attachment") 
       { 
        FileName = fileId+ ".docx" 
       }; 
       response.Content.Headers.ContentType = 
        new MediaTypeHeaderValue("application/vnd.openxmlformats-officedocument.wordprocessingml.document"); 
       response.Headers.Add("Content-Transfer-Encoding", "binary"); 
       response.Content.Headers.ContentLength = fileByteArray.Length; 
       return response; 

    } 

oder wenn Sie eine einfach Razor Mvc-Website Fileresult verwenden: Download file of any type in Asp.Net MVC using FileResult?

+0

Diese Implementation ist für eine Rest-API, jetzt eine triviale Erklärung: Da Sie den Shebang aus der DB lesen, müssen Sie ihn dem Client zur Verfügung stellen, sobald die Antwort den Controller verlässt (um ihn im Speicher oder auf der Platte zu behalten) vom Kunden), mehr Details: http://stackoverflow.com/questions/8156896/difference-between-memory-stream-and-filestream – SilentTremor

+0

Mein schlechtes, benutzte ich zwei Gedächtnisströme :), aktualisiert – SilentTremor

Verwandte Themen