2013-07-26 9 views
7

Der Strom aus einem HTML-Formular über Ajax kommt var jqXHR = data.submit();OpenXml kann nicht geöffnet Paket, weil Filemode oder Fileaccess-Wert nicht gültig für den Strom ist

public static GetWordPlainText(Stream readStream,string filePath) 
{ 
    WordprocessingDocument.Open(readStream, readStream.CanRead); 
} 
[HttpPost] 
public ActionResult FileUpload() 
{ 
var MyFile = Request.Files[0]; 
if (Request.Files.Count > 0 && MyFile != null) 
{ 
    GetWordPlainText(Request.InputStream); 
} 
} 

ich diesen Fehler:

Cannot open package because FileMode or FileAccess value is not valid for the stream.

ich google Das Paket kann nicht geöffnet werden, da der FileMode- oder FileAccess-Wert für den Stream nicht gültig ist, aber nichts Nützliches finden kann. Irgendwelche Ideen?

PS: Anfangs habe ich den Code vereinfacht, um hier viel zu veröffentlichen. Die if-Anweisung wurde hinzugefügt, um die Bedenken von Sten Petrov zu löschen. Ich hoffe, Request.File.count> 0 seine Sorge nicht ansprechen ... ich immer noch das gleiche Problem ...

UPDATE

Als eine Arbeit um ich die Ratschläge unten gefolgt und die Datei in ein Verzeichnis speichern dann openxml ich es aus dem Verzeichnis zu lesen, verwenden

var MyFile = Request.Files[0]; 
    var path = Path.Combine(Server.MapPath("~/App_Data/temp"), MyFile.FileName); 
       using (MemoryStream ms = new MemoryStream()) 
       { 
        //if file exist plz!!!! TODO 

        Request.Files[0].InputStream.CopyTo(ms); 
        System.IO.File.WriteAllBytes(path, ms.ToArray()); 
       } 

dann WordprocessingDocument.Open hat eine Implementierung für filepath so WordprocessingDocument.Open(path); hoffen, dass Sie die Idee von dem, was bekomme ich tat für zukünftige Menschen, die Probleme haben.

Antwort

3

Sie fragen nach Problemen, weil der Request-Stream möglicherweise noch nicht vollständig heruntergeladen wurde.

Ich empfehle, dass Sie die Datei zuerst in einen MemoryStream oder als Datei herunterladen, see here für die letztere Option, dann tun, was Sie wollen, um die hochgeladene Datei.

3

Ich denke, der Stream ist nicht richtig mit Lese-oder Lesezugriff geöffnet.

Von MSDN über WordprocessingDocument.Open Methode (Stream, Boolean)

IOException: Thrown when "stream" is not opened with Read (ReadWrite) access.

+0

Ich werde diese mögliche Lösung betrachten. Denn ich weiß, was Petrov empfohlen hat. – hidden

2

Das Verfahren WordprocessingDocument.Open ist definiert als:

public static WordprocessingDocument Open(Stream stream, bool isEditable) 

Sie den Wert von readStream.CanRead als zweiten Parameter übergeben. Das scheint mir nicht richtig zu sein. Wenn CanReadtrue ist und anzeigt, dass der Stream gelesen werden kann, versuchen Sie, die WordprocessingDocument als bearbeitbar zu öffnen, was der Stream wahrscheinlich nicht unterstützt. Ich würde einfach false für den zweiten Parameter übergeben. Andernfalls übergeben Sie readStream.CanWrite, aber seien Sie nicht überrascht, wenn diese Eigenschaft immer false zurückgibt (wie ich es erwarten würde, wenn es um Streams von hochgeladenen Dateien geht).

http://msdn.microsoft.com/en-us/library/office/cc536138.aspx

+0

WordprocessingDocument.open hat mehrere Überladungen, nämlich Stream, Bool. Allerdings werde ich versuchen, es auf false setzen und lassen Sie wissen, ob ich in der Lage, den Stream anstelle der lahmen Schreib-to-Datei verwenden Sie dann die Zeichenfolge Überladung von WordprocessingDocument.open – hidden

+0

Sorry, ja. Ich wollte die Methodensignatur '(Stream, bool)' posten und bekam die falsche. Ich habe das gerade behoben. Der Punkt, den ich versucht habe zu machen, ist, dass wenn der zweite Parameter dieser Methode "wahr" ist, es erfordert, dass der zugrunde liegende Stream editierbar ist, und der hochgeladene Stream nicht. –