282 votes

Comment accepter un fichier POST - ASP.Net MVC 4 WebAPI

J'utilise asp.net mvc 4 webapi beta pour construire un service de repos. Je dois pouvoir accepter les images / fichiers POSTed des applications clientes. Est-ce possible en utilisant le webapi? Voici comment j'utilise actuellement l'action. Est-ce que quelqu'un connaît un exemple comment cela devrait fonctionner?

 [HttpPost]
public string ProfileImagePost(HttpPostedFile profileImage)
{
    string[] extensions = { ".jpg", ".jpeg", ".gif", ".bmp", ".png" };
    if (!extensions.Any(x => x.Equals(Path.GetExtension(profileImage.FileName.ToLower()), StringComparison.OrdinalIgnoreCase)))
    {
        throw new HttpResponseException("Invalid file type.", HttpStatusCode.BadRequest);
    }

    // Other code goes here

    return "/path/to/image.png";
}
 

409voto

Gleno Points 4580

Je suis surpris que beaucoup d'entre vous semblent vouloir enregistrer des fichiers sur le serveur. La solution pour garder tout en mémoire est la suivante:

 [HttpPost, Route("api/upload")]
public async Task<IHttpActionResult> Upload()
{
    if (!Request.Content.IsMimeMultipartContent())
         throw new Exception(); // divided by zero

    var provider = new MultipartMemoryStreamProvider();
    await Request.Content.ReadAsMultipartAsync(provider);
    foreach (var file in provider.Contents)
    {
        var filename = file.Headers.ContentDisposition.FileName.Trim('\"');
        var buffer = await file.ReadAsByteArrayAsync();
        //Do whatever you want with filename and its binaray data.
    }

    return Ok();
}
 

177voto

Mike Wasson Points 3104

Voir http://www.asp.net/web-api/overview/working-with-http/sending-html-form-data, - partie - 2, même si je pense que l’article fait apparaître un peu plus compliquée qu’il est vraiment.

Fondamentalement,

119voto

Brent Matzelle Points 1604

Un article récent de c# Corner (7/2013), « Télécharger un fichier dans ASP.Net Web API », illustre un code très simple pour les téléchargements :

13voto

Steve Stokes Points 681

J’ai utilisé la réponse de Mike Wasson avant j’ai mis à jour tous les NuGets dans mon projet de mvc4 webapi. Une fois que j’ai fait, j’ai dû réécrire l’action de téléchargement du fichier :

Apparemment BodyPartFileNames n’est plus disponible au sein de la MultipartFormDataStreamProvider.

10voto

Daniel Melo Points 51

Vers cette même direction, je poste client et le serveur snipets qui envoient des Fichiers Excel à l'aide de WebApi, c# 4:

public static void SetFile(String serviceUrl, byte[] fileArray, String fileName)
{
    try
    {
        using (var client = new HttpClient())
        {
                client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
                using (var content = new MultipartFormDataContent())
                {
                    var fileContent = new ByteArrayContent(fileArray);//(System.IO.File.ReadAllBytes(fileName));
                    fileContent.Headers.ContentDisposition = new ContentDispositionHeaderValue("attachment")
                    {
                        FileName = fileName
                    };
                    content.Add(fileContent);
                    var result = client.PostAsync(serviceUrl, content).Result;
                }
        }
    }
    catch (Exception e)
    {
        //Log the exception
    }
}

Et le serveur webapi contrôleur:

public Task<IEnumerable<string>> Post()
{
    if (Request.Content.IsMimeMultipartContent())
    {
        string fullPath = HttpContext.Current.Server.MapPath("~/uploads");
        MyMultipartFormDataStreamProvider streamProvider = new MyMultipartFormDataStreamProvider(fullPath);
        var task = Request.Content.ReadAsMultipartAsync(streamProvider).ContinueWith(t =>
        {
            if (t.IsFaulted || t.IsCanceled)
                    throw new HttpResponseException(HttpStatusCode.InternalServerError);

            var fileInfo = streamProvider.FileData.Select(i =>
            {
                var info = new FileInfo(i.LocalFileName);
                return "File uploaded as " + info.FullName + " (" + info.Length + ")";
            });
            return fileInfo;

        });
        return task;
    }
    else
    {
        throw new HttpResponseException(Request.CreateResponse(HttpStatusCode.NotAcceptable, "Invalid Request!"));
    }
}

Et la Coutume MyMultipartFormDataStreamProvider, nécessaires pour personnaliser le nom du fichier:

PS: j'ai pris ce code à partir d'un autre poste http://www.codeguru.com/csharp/.net/uploading-files-asynchronously-using-asp.net-web-api.htm

public class MyMultipartFormDataStreamProvider : MultipartFormDataStreamProvider
{
    public MyMultipartFormDataStreamProvider(string path)
        : base(path)
    {

    }

    public override string GetLocalFileName(System.Net.Http.Headers.HttpContentHeaders headers)
    {
        string fileName;
        if (!string.IsNullOrWhiteSpace(headers.ContentDisposition.FileName))
        {
            fileName = headers.ContentDisposition.FileName;
        }
        else
        {
            fileName = Guid.NewGuid().ToString() + ".data";
        }
        return fileName.Replace("\"", string.Empty);
    }
}

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