Me gustaría publicar un archivo a mi webapi. No es el problema, pero:

  1. Me no desea utilizar javascript
  2. El archivo debe ser recibido y guardado de forma sincrónica
  3. Me gustaría que mi acción a este aspecto:

    public void Post(byte[] file)
    {
    
    }

    o:

    public void Post(Stream stream)
    {
    
    }
  4. Quiero publicar archivo de código similar a este (por supuesto, ahora no funciona):

    <form id="postFile" enctype="multipart/form-data" method="post">
    
        <input type="file" name="file" />
    
        <button value="post" type="submit" form="postFile"  formmethod="post" formaction="<%= Url.RouteUrl("WebApi", new { @httpRoute = "" }) %>" />
    
    </form>

Cualquier sugerencia será apreciado

InformationsquelleAutor Fuffu | 2015-10-28

2 Comentarios

  1. 11

    El ejemplo más sencillo sería algo como esto

    [HttpPost]
    [Route("")]
    public async Task<HttpResponseMessage> Post()
    {
        if (!Request.Content.IsMimeMultipartContent())
        {
            throw new HttpResponseException(HttpStatusCode.UnsupportedMediaType);
        }
    
        var provider = new MultipartFormDataStreamProvider(HostingEnvironment.MapPath("~/App_Data"));
    
        var files = await Request.Content.ReadAsMultipartAsync(provider);
    
        //Do something with the files if required, like saving in the DB the paths or whatever
        await DoStuff(files);
    
        return Request.CreateResponse(HttpStatusCode.OK);;
    }

    No es sincrónico versión de ReadAsMultipartAsync así que es mejor jugar a lo largo.

    ACTUALIZACIÓN:

    Si usted está utilizando IIS servidor de hosting, usted puede tratar de la manera tradicional:

    public HttpResponseMessage Post()
    {
        var httpRequest = HttpContext.Current.Request;
        if (httpRequest.Files.Count > 0)
        {
            foreach (string fileName in httpRequest.Files.Keys)
            {
                var file = httpRequest.Files[fileName];
                var filePath = HttpContext.Current.Server.MapPath("~/" + file.FileName);
                file.SaveAs(filePath);
            }
    
            return Request.CreateResponse(HttpStatusCode.Created);
        }
    
        return Request.CreateResponse(HttpStatusCode.BadRequest);
    }
    • Gracias por la respuesta, pero he encontrado esta solución antes. No es satisfactoria para mí. Yo realmente necesita hacerlo de forma sincrónica.
    • Puedo preguntar por qué? Tengo curiosidad.
    • Esta aplicación va a utilizar de muchas culturas diferentes. Cada nuevo subproceso se inicia en la cultura por defecto y no es el comportamiento esperado para mí. No se pueden utilizar las CultureInfo.DefaultThreadCurrentCulture demasiado porque no se admite en .NET 4.0 todavía.
    • Lo que yo veo. Han considerado que esta solución? stackoverflow.com/questions/20601578/…
    • Que se ve bastante bien para mí, pero todavía estoy curioso por saber si es posible hacerlo de forma sincrónica
    • Después de la consideración que tengo que me dijo que ya no uso esta solución porque se requiere .NET 4.5. Otras sugerencias?
    • Pero el título indica que se está utilizando la API de Web 2, que necesita .NET 4.5 por lo que yo sé. stackoverflow.com/questions/20411029/…
    • He actualizado con un ejemplo el uso de la forma tradicional extraído de aquí, stackoverflow.com/a/20356591/307976
    • cómo hacerlo con otro tipo de valores, por ejemplo, guardar el nombre,la dirección,la imagen en una sola petición en un objeto.el uso de webapi

  2. -2

    Creo que la acción debe ser como

    [HttpPost]
        public ActionResult post(HttpPostedFileBase file)
        {
            //Verify that the user selected a file
            if (file != null && file.ContentLength > 0) 
            {
                //extract only the filename
                var fileName = Path.GetFileName(file.FileName);
                //store the file inside ~/App_Data/uploads folder
                var path = Path.Combine(Server.MapPath("~/App_Data/uploads"), fileName);
                file.SaveAs(path);
            }
            //redirect back to the index action to show the form once again
            return RedirectToAction("Index");        
        }
    • Que es MVC, no WebAPI 🙂

Dejar respuesta

Please enter your comment!
Please enter your name here