Je télécharge des fichiers à l'aide de l'API Web ASP.NET. Je l'ai fait avant le RC, mais pour une raison quelconque, le fichier est enregistré en tant que "BodyPart_3ded2bfb-40be-4183-b789-9301f93e90af" au lieu du nom de fichier. La variable de nom de fichier ci-dessous renvoie également cette chaîne de parties de corps au lieu du nom de fichier. Je n'arrive pas à comprendre où je me trompe. 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
});
};
Manette:
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 à:
C'est un changement consciencieux que nous avons fait - il a été considéré comme un risque pour la 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 souhaitez 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 souhaitez. Notez cependant que cela peut être dû à des considérations de sécurité.
J'espère que cela t'aides,
Henrik
J'ai mis à jour le code du didacticiel pour le faire fonctionner avec ASP.NET Web API RC. En effet, comme Henrik l'a mentionné, Content-Disposition n'est plus utilisé comme nom de fichier. Voir les fichiers sources en bas de l'article - 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 apportées à MultipartFormDataStreamProvider qui n'ont pas fait la coupe au RC, il est donc encore plus flexible. Henrik a blogué sur ceux qui sont 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 manière nouvelle et améliorée de télécharger des fichiers dans Web API RTM, donc j'espère 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/
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);
}
}
Ensuite
string root = HttpContext.Current.Server.MapPath("~/App_Data");
CustomMultipartFormDataStreamProvider provider = new CustomMultipartFormDataStreamProvider(root);
Merci,