ASP.NET fichier API Web enregistré en tant que "BodyPart 3ded2bfb-40be-4183-b789-9301f93e90af"

Je télécharge des fichiers en utilisant le ASP.NET API Web. Je l'ai fait avant le RC mais pour une raison quelconque, le fichier est enregistré comme "BodyPart_3ded2bfb-40be-4183-b789-9301f93e90af" au lieu du nom du fichier. La variable filename ci-dessous renvoie également cette chaîne bodypart au lieu du nom du fichier. Je n'arrive pas à comprendre où je vais mal. Toute aide est appréciée.

Code Client:

function upload() {
    $("#divResult").html("Uploading...");
    var formData = new FormData($('form')[0]); 
    $.ajax({
        url: 'api/files/uploadfile?folder=' + $('#ddlFolders').val(),
        type: 'POST',
        success: function (data) {
            $("#divResult").html(data);
        },
        data: formData,
        cache: false,
        contentType: false,
        processData: false
    });
}; 

Contrôleur:

    public Task<HttpResponseMessage> UploadFile([FromUri]string folder)
    {
        if (!Request.Content.IsMimeMultipartContent())
        {
            throw new HttpResponseException(Request.CreateResponse(HttpStatusCode.UnsupportedMediaType));
        }

        // Save file
        MultipartFormDataStreamProvider provider = new MultipartFormDataStreamProvider(HttpContext.Current.Server.MapPath("~/Files"));
        Task<IEnumerable<HttpContent>> task = Request.Content.ReadAsMultipartAsync(provider);

        return task.ContinueWith<HttpResponseMessage>(contents =>
        {
            string filename = provider.BodyPartFileNames.First().Value;
            return new HttpResponseMessage()
          {
              Content = new StringContent(string.Format("File saved in {0}.", folder))
          };

        }, TaskScheduler.FromCurrentSynchronizationContext());

Les fichiers ressemblent à:

entrez la description de l'image ici

34
demandé sur Rivka 2012-06-10 21:30:36

3 réponses

C'était un changement conscient que nous avons fait - il était considéré comme un risque de sécurité de prendre le nom de fichier fourni dans le champ D'en-tête Content-Disposition et donc à la place nous calculons maintenant un nom de fichier qui est ce que vous voyez.

Si vous voulez contrôler vous-même le nom de fichier local du serveur, vous pouvez dériver de MultipartFormDataStreamProvider et remplacer GetLocalFileName pour fournir le nom que vous voulez. Notez cependant qu'il peut y avoir des considérations de sécurité.

J'espère que ça aide,

Henrik

46
répondu Henrik Frystyk Nielsen 2012-06-10 20:57:01

J'ai mis à jour le code du tutoriel pour le faire fonctionner avec ASP.NET accueil En effet, comme Henrik mentionné Content-Disposition n'est plus utilisé un nom de fichier. Voir les fichiers source en bas de la publication - http://www.strathweb.com/2012/04/html5-drag-and-drop-asynchronous-multi-file-upload-with-asp-net-webapi/

Veuillez noter qu'il y a d'autres modifications à MultipartFormDataStreamProvider qui n'ont pas fait la coupe à la RC, donc c'est maintenant encore plus flexible. Henrik blogué sur ceux ici - http://blogs.msdn.com/b/henrikn/archive/2012/04/27/asp-net-web-api-updates-april-27.aspx.

EDIT: j'ai blogué sur la façon nouvelle et améliorée de télécharger des fichiers dans L'API Web RTM, de sorte que cela devrait aider à organiser les choses - http://www.strathweb.com/2012/08/a-guide-to-asynchronous-file-uploads-in-asp-net-web-api-rtm/

18
répondu Filip W 2012-09-06 06:44:17

Ici, ce travail pour moi

Dans le contrôleur API

// We implement MultipartFormDataStreamProvider to override the filename of File which
// will be stored on server, or else the default name will be of the format like Body-
// Part_{GUID}. In the following implementation we simply get the FileName from 
// ContentDisposition Header of the Request Body.
public class CustomMultipartFormDataStreamProvider : MultipartFormDataStreamProvider
{
    public CustomMultipartFormDataStreamProvider(string path) : base(path) { }

    public override string GetLocalFileName(HttpContentHeaders headers)
    {
        return headers.ContentDisposition.FileName.Replace("\"", string.Empty);
    }
}

Puis

 string root = HttpContext.Current.Server.MapPath("~/App_Data");       
 CustomMultipartFormDataStreamProvider provider = new CustomMultipartFormDataStreamProvider(root);

Merci,

9
répondu VietNguyen 2015-12-07 02:23:16