2011-09-19 6 views
19

Actuellement, j'ai un byte[] qui contient toutes les données d'un fichier image, je veux juste construire une instance de HttpPostedFileBase afin que je puisse utiliser une méthode existante, au lieu de créer une nouvelle surcharge.Comment créer une instance de HttpPostedFileBase (ou son type hérité)

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

Avez-vous obtenu la réponse pour travailler pour analyser le fichier stocké dans l'octet []? Le mien conserve la disposition du contenu, etc. – Devela

Répondre

36

Créer une classe dérivée comme suit:

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

Maintenant, vous pouvez passer par exemple de cette classe où HttpPostedFileBase est attendue.

+2

Je voulais juste montrer comment utiliser MemoryFile après avoir créé: 'string filePath = Path.GetFullPath (" C: \\ images.rar "); FileStream fileStream = nouveau FileStream (filePath, FileMode.Open); MemoryFile fileImage = nouveau MemoryFile (fileStream, "application/x-rar-compressed", "images.rar"); ' – Murat

1

Vous ne pouvez pas créer manuellement une instance de HttpPostedFileBase ou classes dérivées (HttpPostedFile). Cette classe est seulement censée être instanciée par le framework. Pourquoi ne pas vous débarrasser de l'action du second contrôleur qui prend un tableau d'octets? Ce n'est pas nécessaire. Le classeur par défaut fonctionnera très bien avec celui qui prend un HttpPostedFileBase.

+1

Le développeur js m'envoie l'octet [], ce problème survient lorsque l'utilisateur colle une image du presse-papiers au lieu de sélectionner un fichier image à télécharger. –

+0

@Danny Chen, js envoie un 'byte []'? Cela semble très étrange. Quel protocole est utilisé? –

+1

Il m'envoie une chaîne base64, ce comportement est effectué par un éditeur js tiers. –

Questions connexes