2011-09-19 22 views
19

Actualmente tengo un byte[] que contiene todos los datos de un archivo de imagen, solo quiero construir una instancia de HttpPostedFileBase para que pueda usar un método existente, en lugar de creando una nueva sobrecarga.Cómo crear una instancia de HttpPostedFileBase (o su tipo heredado)

public ActionResult Save(HttpPostedFileBase file) 

public ActionResult Save(byte[] data) 
{ 
    //Hope I can construct an instance of HttpPostedFileBase here and then 
    return Save(file); 

    //instead of writing a lot of similar codes 
} 
+0

¿Recibió la respuesta para trabajar para analizar el archivo almacenado en el byte []? Mine mantiene la disposición del contenido, etc. – Devela

Respuesta

36

Crear una clase derivada de la siguiente manera:

class MemoryFile : HttpPostedFileBase 
{ 
Stream stream; 
string contentType; 
string fileName; 

public MemoryFile(Stream stream, string contentType, string fileName) 
{ 
    this.stream = stream; 
    this.contentType = contentType; 
    this.fileName = fileName; 
} 

public override int ContentLength 
{ 
    get { return (int)stream.Length; } 
} 

public override string ContentType 
{ 
    get { return contentType; } 
} 

public override string FileName 
{ 
    get { return fileName; } 
} 

public override Stream InputStream 
{ 
    get { return stream; } 
} 

public override void SaveAs(string filename) 
{ 
    using (var file = File.Open(filename, FileMode.CreateNew)) 
     stream.CopyTo(file); 
} 
} 

Ahora puede pasar a instancia de esta clase en la que se espera HttpPostedFileBase.

+2

Solo quería mostrar cómo usar MemoryFile después de haber creado: 'string filePath = Path.GetFullPath (" C: \\ images.rar "); FileStream fileStream = new FileStream (filePath, FileMode.Open); MemoryFile fileImage = new MemoryFile (fileStream, "application/x-rar-compressed", "images.rar"); ' – Murat

1

No se puede crear manualmente una instancia de HttpPostedFileBase o derivados clases (HttpPostedFile). Se supone que esta clase solo debe ser instanciada por el marco. ¿Por qué no te deshaces de la segunda acción del controlador que toma una matriz de bytes? No es necesario. La carpeta de modelo predeterminada funcionará bien con la que toma un HttpPostedFileBase.

+1

El desarrollador de js me envía el byte [], este problema ocurre cuando el usuario pega una imagen del portapapeles, en lugar de seleccionar un archivo de imagen para cargar. –

+0

@Danny Chen, js enviando un 'byte []'? Eso parece muy raro. ¿Qué protocolo se está utilizando? –

+1

Me está enviando una cadena base64, este comportamiento lo realiza un editor js de terceros. –

Cuestiones relacionadas