35 votes

Comment puis-je obtenir de jQuery Uploadify plugin fonctionne avec ASP.NET MVC?

Je suis en train d'essayer d'obtenir le plugin jQuery, Uploadify, de travailler avec ASP.NET MVC.

J'ai le plugin montrant bien avec de l'extrait en JavaScript suivant:

<script type="text/javascript">
    $(document).ready(function() {
        $('#fileUpload').fileUpload({
            'uploader': '/Content/Flash/uploader.swf',
            'script': '/Placement/Upload',
            'folder': '/uploads',
            'multi': 'true',
            'buttonText': 'Browse',
            'displayData': 'speed',
            'simUploadLimit': 2,
            'cancelImg': '/Content/Images/cancel.png'
        });
    });
</script>

Il semble que tout est bien bonne. Si vous avez remarqué, le "script" de l'attribut est défini sur mon /Placement/Upload, ce qui est mon Stage de Contrôleur et de mon Action Télécharger.

Le principal problème est, je vais avoir de la difficulté à obtenir cette action à feu pour recevoir le fichier. J'ai mis un point d'arrêt sur cette action et lorsque je sélectionne un fichier à télécharger, il n'est pas exécuté.

J'ai essayé de changer la signature de la méthode basée sur cet article:

public string Upload(HttpPostedFileBase FileData)
{
    /*
    *
    * Do something with the FileData
    *
    */
    return "Upload OK!";
}

Mais ce n'est toujours pas le feu.

Quelqu'un peut-il m'aider à écrire et obtenir le Téléchargement de contrôleur de l'action de la signature correctement de sorte qu'il sera en fait le feu? Je peux alors faire affaire avec le fichier de données moi-même. J'ai juste besoin d'obtenir de l'aide de la méthode d'action de feu.

20voto

Justin Points 617
public string Upload(HttpPostedFileBase FileData) {}

est - il correct, le fichier téléchargé par uploadify obtiendrez liées à la FileData. Pas besoin d'entrer dans la Demande.Les fichiers à récupérer le fichier, ce qui rend difficile de se moquer et de test.

Si votre action n'est-ce pas de tir à tous (c'est à dire essayer de débogage et de voir si un point d'arrêt à l'intérieur de la méthode est touché), alors votre problème est probablement le 'script' valeur - êtes-vous en cours d'exécution en vertu d'un répertoire virtuel? Si oui, vous aurez besoin de mettre le nom du répertoire. Uploadify est à l'aide d'un chemin d'accès absolu.

c'est à dire " le script: '/virtual_directory/Placement/Upload'

maintenant uploadify est l'envoi de http://localhost/Placement/Upload.

également essayer d'utiliser la route débogueur (http://haacked.com/archive/2008/03/13/url-routing-debugger.aspx) pour vérifier où votre itinéraire est mis en correspondance.

10voto

dp. Points 3090

Le problème est peut-être que vous avez besoin de spécifier l'action à télécharger pour est Post...il ne fonctionnera pas avec l'action comme une action.

Donc, ceci:

public string Upload(HttpPostedFileBase FileData)
{
   //do something
}

Devrait être ceci:

[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Upload(HttpPostedFileBase FileData)
{
   //do something
}

Sachez également que si vous utilisez cette dans un "connecté" section de votre site, vous devriez jeter un oeil ici pour un bug connu avec uploadify et d'authentification: http://geekswithblogs.net/apopovsky/archive/2009/05/06/working-around-flash-cookie-bug-in-asp.net-mvc.aspx

Aussi, il suffit d'un côté, il y a plusieurs façons MVC gérer les uploads de fichier (à l'aide de la Demande.Fichiers comme par Rory Fitzpatrick de la suggestion, en tant que bien que passer les HttpPostedFileBase fichier comme argument dans la définition de action). Il ne devrait pas vraiment d'importance afin d'obtenir Uploadify de travail.

2voto

roryf Points 14520

Ce n'est pas la façon dont j'ai eu à mettre en œuvre des fichier télécharger. J'ai eu une méthode d'action avec aucun paramètre n'est utilisé que la Demande actuelle de l'objet de plonger dans la collection de fichiers publiés.

Quelques exemples de code à partir de mon application:

[AcceptVerbs(HttpVerbs.Post)]
public ContentResult Upload() {
    if (Request.Files.Count > 0 && Request.Files[0].ContentLength > 0) {
        HttpPostedFileBase postedFile = Request.Files[0];
        // Do something with it
    }
}

Bien sûr, l'écriture de tests pour cela devient un pain PITA. Vous avez à se moquer de plusieurs objets afin de le faire fonctionner, par exemple:

var mockHttpContext = mocks.StrictMock<HttpContextBase>();
var mockRequest = mocks.StrictMock<HttpRequestBase>();
var postedFile = mocks.StrictMock<HttpPostedFileBase>();

var postedFileKeyCollection = mocks.StrictMock<HttpFileCollectionBase>();

mockHttpContext.Expect(x => x.Request).Return(mockRequest).Repeat.Any();
mockRequest.Expect(x => x.Files).Return(postedFileKeyCollection).Repeat.Any();

postedFileKeyCollection.Expect(x => x[0]).Return(postedFile).Repeat.Any();
postedFileKeyCollection.Expect(x => x.Count).Return(1);

postedFile.Expect(f => f.ContentLength).Return(1024);
postedFile.Expect(f => f.InputStream).Return(null);

Il serait plus facile de créer une interface dans les fichiers publiés et seulement se moquer de ce que, avec une mise en œuvre concrète injecté dans votre contrôleur à l'aide du Cio.

Je pense que c'était en grande partie basé sur ce post: la mise en Œuvre de HTTP Upload de Fichier avec ASP.NET MVC, y compris des Tests et se moque de

2voto

James McCormack Points 4828

Ma solution à ce problème peut résoudre votre problème. Espérons que cela aide.

http://zootfroot.blogspot.com/2010/12/mvc-file-upload-using-uploadify-with.html

0voto

tvanfosson Points 268301

La lecture de la documentation, il semble que c'est l'envoi d'un tableau de fichiers. Avez-vous essayé:

public string Upload( HttpPostedFileBase[] fileData )

Il est également possible que le modèle de classeur par défaut ne fonctionne pas avec les HttpPostedFileBase et vous devrez soit utiliser Rory mécanisme ou écrire votre propre modèle de classeur.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X