2013-07-26 11 views
7

Il flusso proviene da un form HTML tramite la tecnologia AJAX var jqXHR = data.submit();OpenXml Can pacchetto non apre perché FileMode o FileAccess valore non è valido per il flusso

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); 
} 
} 

ottengo questo errore:

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

I google Impossibile aprire il pacchetto perché il valore FileMode o FileAccess non è valido per lo stream ma non riesce a trovare nulla di utile. Qualche idea?

PS: Inizialmente ho semplificato il codice da pubblicare qui molto. Aggiunta la dichiarazione if in modo che cancellasse la preoccupazione di Sten Petrov. Spero Request.File.count> 0 non affrontare la sua preoccupazione ... ho ancora lo stesso problema ...

UPDATE

Per ovviare ho seguito i consigli di seguito e salvare il file in una directory allora io uso OpenXML a leggere dalla directory

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()); 
       } 

poi WordprocessingDocument.Open dispone di un'implementazione per percorsofile così WordprocessingDocument.Open(path); auguro che si ottiene l'idea di quello che ho fatto per le persone che hanno problemi futuri.

risposta

3

Quello che stai facendo è un problema, perché il flusso della richiesta potrebbe non essere stato scaricato completamente.

Suggerisco di scaricare il file prima in un MemoryStream o in un file, see here per l'ultima opzione, quindi fare ciò che si desidera sul file caricato.

3

Suppongo che il flusso non sia stato correttamente aperto con accesso read o readwrite.

Da MSDN sul metodo WordprocessingDocument.Open (Stream, Boolean)

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

+0

Mi occuperò di questa possibile soluzione. Per sapere ho fatto ciò che Petrov ha raccomandato. – hidden

2

Il metodo WordprocessingDocument.Open è definito come:

public static WordprocessingDocument Open(Stream stream, bool isEditable) 

si sta passando il valore della readStream.CanRead come secondo parametro. Questo non mi sembra corretto. Se CanRead è true, a indicare che è possibile leggere lo stream, si sta tentando di aprire WordprocessingDocument come modificabile, che probabilmente lo stream non supporta. Vorrei solo passare false per il secondo parametro. Altrimenti, passare readStream.CanWrite ma non sorprenderti se questa proprietà restituisce sempre false (come mi aspetterei quando si tratta di flussi da file caricati).

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

+0

WordprocessingDocument.open ha diversi overloads, ovvero stream, bool. Tuttavia, proverò a impostarlo su false e ti faccio sapere se sono stato in grado di utilizzare lo stream anziché lo script lame su file, quindi utilizzare l'overload di stringhe di WordprocessingDocument.open – hidden

+0

Spiacente, sì. Intendevo pubblicare la firma del metodo '(Stream, bool)' e ho ottenuto quella sbagliata. Ho appena aggiustato. Il punto che stavo cercando di fare è che quando il secondo parametro di questo metodo è 'true', richiede che il flusso sottostante sia modificabile e che lo stream caricato non lo sia. –