40 votes

MVC3 Valums Ajax File Upload

Je suis en train d'utiliser valums ajax uploader. http://valums.com/ajax-upload/

J'ai le texte suivant sur ma page:

var button = $('#fileUpload')[0];
var uploader = new qq.FileUploader({
    element: button,
    allowedExtensions: ['jpg', 'jpeg', 'png', 'gif'], 
    sizeLimit: 2147483647, // max size
    action: '/Admin/Home/Upload',
    multiple: false
});

il n'post à mon contrôleur, mais qqfile est toujours null. J'ai essayé ceux-ci:

public ActionResult Upload(HttpPostedFile qqfile)
AND
HttpPostedFileBase file = Request.Files["file"];

sans un peu de chance.

J'ai trouvé un exemple pour ruby on rails, mais vous ne savez pas comment la mettre en œuvre dans MVC http://www.jigsawboys.com/2010/10/06/ruby-on-rails-ajax-file-upload-with-valum/

Dans firebug, je vois ceci: http://localhost:61143/Admin/Home/Upload?qqfile=2glonglonglongname+-+Copy.gif

enter image description here

enter image description hereenter image description here

enter image description here

68voto

Shane Km Points 5233

Je l'ai compris. cela fonctionne dans IE et Mozilla.

     [HttpPost]
    public ActionResult FileUpload(string qqfile)
    {
        var path = @"C:\\Temp\\100\\";
        var file = string.Empty;

        try
        {
            var stream = Request.InputStream;
            if (String.IsNullOrEmpty(Request["qqfile"]))
            {
                // IE
                HttpPostedFileBase postedFile = Request.Files[0];
                stream = postedFile.InputStream;
                file = Path.Combine(path, System.IO.Path.GetFileName(Request.Files[0].FileName));
            }
            else
            {
                //Webkit, Mozilla
                file = Path.Combine(path, qqfile);
            }

            var buffer = new byte[stream.Length];
            stream.Read(buffer, 0, buffer.Length);
            System.IO.File.WriteAllBytes(file, buffer);
        }
        catch (Exception ex)
        {
            return Json(new { success = false, message = ex.Message }, "application/json");
        }

       return Json(new { success = true }, "text/html");
    }
 

1voto

Darin Dimitrov Points 528142

Ce composant envoie un application/octet-stream au lieu de multipart/form-data lequel le classeur de modèles par défaut peut fonctionner. Vous ne pouvez donc pas vous attendre à ce que Request.Files ait une telle valeur avec une telle requête.

Vous devrez lire manuellement le flux de demandes:

 public ActionResult Upload(string qqfile)
{
    var stream = Request.InputStream;
    var buffer = new byte[stream.Length];
    stream.Read(buffer, 0, buffer.Length);

    var path = Server.MapPath("~/App_Data");
    var file = Path.Combine(path, qqfile);
    File.WriteAllBytes(file, buffer);

    // TODO: Return whatever the upload control expects as response
}
 

1voto

Simon Halsey Points 4114

IE télécharge en utilisant multipart-mime. D'autres navigateurs utilisent Octet-Stream.

J'ai écrit un gestionnaire de téléchargement à utiliser avec Valums Ajax Uploader qui fonctionne avec MVC et Webforms et les deux méthodes de téléchargement. Je serais heureux de partager avec vous si vous vouliez. Il suit de près le gestionnaire PHP.

Mon contrôleur pour gérer le téléchargement ressemble à ceci:

 public class UploadController : Controller
{
    private IUploadService _Service;

    public UploadController()
        : this(null)
    {
    }

    public UploadController(IUploadService service)
    {
        _Service = service ?? new UploadService();
    }

    public ActionResult File()
    {
        return Content(_Service.Upload().ToString());
    }
 

Le UploadService ressemble à ceci:

 public class UploadService : IUploadService
{
    private readonly qq.FileUploader _Uploader;

    public UploadService()
        : this(null)
    { }

    public UploadService(IAccountService accountservice)
    {
        _Uploader = new qq.FileUploader();
    }

    public UploadResult Upload()
    {
        qq.UploadResult result = _Uploader.HandleUpload();
        if (!result.Success)
            return new UploadResult(result.Error);

                     .... code .....

        return new UploadResult((Guid)cmd.Parameters["@id"].Value);
        }
        catch (Exception ex)
        {
            return new UploadResult(System.Web.HttpUtility.HtmlEncode(ex.Message));
        }
        finally
        {
                      ............code.........
        }

    }

   ...............code ............
 

1voto

bob Points 11

Tu devrais essayer:

 Stream inputStream = (context.Request.Files.Count > 0) ? context.Request.Files[0].InputStream : context.Request.InputStream;
 

0voto

Gaurang Jadia Points 987

Je développe sous ASP.Net 4.0 mais nous n’avons pas d’architecture MVC. J'ai eu le même problème il y a quelques jours. Mais, je l'ai compris et voici ma solution.

 //For IE Browser
HttpPostedFile selectedfile = Request.Files[0];
System.Drawing.Bitmap obj = new System.Drawing.Bitmap(selectedfile.InputStream);

//For Non IE Browser
System.Drawing.Bitmap obj = new System.Drawing.Bitmap(Request.InputStream);
 

Maintenant, vous pouvez utiliser obj pour d'autres opérations.

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