Dans ma classe ApiController, j'ai la méthode suivante pour télécharger un fichier créé par le serveur.
public HttpResponseMessage Get(int id)
{
try
{
string dir = HttpContext.Current.Server.MapPath("~"); //location of the template file
Stream file = new MemoryStream();
Stream result = _service.GetMyForm(id, dir, file);
if (result == null)
{
return Request.CreateResponse(HttpStatusCode.NotFound);
}
result.Position = 0;
HttpResponseMessage response = new HttpResponseMessage();
response.StatusCode = HttpStatusCode.OK;
response.Content = new StreamContent(result);
return response;
}
catch (IOException)
{
return Request.CreateResponse(HttpStatusCode.InternalServerError);
}
}
Tout fonctionne parfaitement, sauf que le nom du fichier de téléchargement par défaut est son identifiant, de sorte que l'utilisateur devra peut-être taper son propre nom de fichier dans la boîte de dialogue Enregistrer sous à chaque fois. Existe-t-il un moyen de définir un nom de fichier par défaut dans le code ci-dessus?
c#
asp.net-web-api
Tae-Sung Shin
la source
la source
Réponses:
Vous devez définir l'en-
Content-Disposition
tête surHttpResponseMessage
:la source
System.Net.Mime.ContentDisposition
ouContentDispositionHeaderValue
? L'un est-il plus actuel et plus préféré que l'autre?ActionResult
, un pourHttpResponseMessage
ActionResult
et l'autre pour les WebApiHttpResponseMessage
.EDIT: Comme mentionné dans un commentaire, Ma réponse ne tient pas compte des caractères qui doivent être échappés comme un
;
. Vous devez utiliser la réponse acceptée par Darin si votre nom de fichier peut contenir un point-virgule.Ajoutez un Response.AddHeader pour définir le nom du fichier
Remplacez simplement FILE_NAME par le nom du fichier.
la source
;
ou quelque chose d'autre avec une signification particulière?Si vous voulez vous assurer que le nom de fichier est correctement encodé mais également éviter le WebApi HttpResponseMessage, vous pouvez utiliser ce qui suit:
Vous pouvez utiliser ContentDisposition ou ContentDispositionHeaderValue. L'appel de ToString sur une instance de l'un ou l'autre effectuera le codage des noms de fichiers pour vous.
la source
Je pense que cela pourrait vous être utile.
la source
;
ou quelque chose d'autre avec une signification particulière?Vous devez ajouter l'en-tête content-disposition à la réponse:
la source
;
ou quelque chose d'autre avec une signification particulière?Si vous utilisez ASP.NET Core MVC, les réponses ci-dessus sont très légèrement modifiées ...
Dans ma méthode d'action (qui retourne
async Task<JsonResult>
) j'ajoute la ligne (n'importe où avant l'instruction return):la source
Cela devrait faire:
la source
;
ou quelque chose d'autre avec une signification particulière?Remarque: la dernière ligne est obligatoire.
Si nous n'avons pas spécifié Access-Control-Expose-Headers , nous n'obtiendrons pas le nom de fichier dans l'interface utilisateur.
la source
Compte tenu des réponses précédentes, il faut faire attention aux caractères globalisés.
Supposons que le nom du fichier soit: " Esdrújula prenda ñame - güena.jpg "
Résultat brut à télécharger: "Esdrújula prenda à ± ame - güena.jpg" [Moche]
Résultat HtmlEncode à télécharger: "Esdr & _250; jula prenda & _241; ame - g & _252; ena.jpg" [Ugly]
Résultat UrlEncode à télécharger: " Esdrújula + prenda + ñame + - + güena.jpg " [OK]
Ensuite, vous devez presque toujours utiliser UrlEncode sur le nom du fichier . De plus, si vous définissez l'en-tête de disposition de contenu en tant que chaîne directe, vous devez vous assurer que l'encadrement est entre guillemets pour éviter les problèmes de compatibilité du navigateur.
ou avec l'aide de classe:
Le System.Net.Mime. La classe ContentDisposition prend en charge les citations.
la source