6 votes

Chrome sous Windows ajoute des traits de soulignement aux fichiers téléchargés ?

Je suis confronté à une situation assez étrange, que j'ai du mal à retrouver dans une application Django existante. L'une des vues, qui hérite de APIView, renvoie un fichier lorsqu'un utilisateur effectue un appel POST. Le point de terminaison fonctionne bien, mais il se passe quelque chose de bizarre lorsque le fichier téléchargé atteint la machine du client. Au moment où le navigateur reçoit le fichier, l'extension du fichier a été renommée avec un trait de soulignement à la fin. (Ainsi, si le fichier était à l'origine "test.txt", la version que le client reçoit est "test.txt_").

D'après ce que je peux voir, juste avant que l'objet de réponse ne soit renvoyé dans l'APIView, les en-têtes content-type et content-disposition semblent corrects. Par exemple :

Content-Type: application/octet-stream
Content-Disposition: attachment;filename="test.txt"

Ce même fichier, lorsqu'il apparaît dans les téléchargements de Chrome, est nommé "test.txt_" - avec le trait de soulignement à la fin. J'ai essayé la même chose dans Firefox, et il semble se télécharger correctement. Malheureusement, il est impossible de dire à la majorité de nos utilisateurs de changer de navigateur.

J'ai essayé :

  • Forcer un type de contenu différent (par exemple : au lieu de "application/octet-stream", essayez "application/text", juste pour voir ce qui se passe). Cela n'a eu aucun effet.
  • Le formatage de la disposition du contenu est légèrement différent (par exemple : espace entre le point-virgule et le nom de fichier). Cela n'a pas eu d'effet non plus.
  • Suppression des guillemets doubles autour du nom de fichier dans l'en-tête content-disposition. Sans effet.
  • Je place des points d'arrêt dans le Rest Framework lui-même, mais Visual Studio Code ne semble pas les déclencher. (Je ne suis pas très familier avec le débogage via Visual Studio Code, donc cela peut être ma faute).
  • J'ai supprimé tout middleware personnalisé, les seuls middleware restants sont donc les suivants :

    corsheaders.middleware.CorsMiddleware django.contrib.sessions.middleware.SessionMiddleware django.middleware.locale.LocaleMiddleware django.middleware.common.CommonMiddleware django.middleware.csrf.CsrfViewMiddleware django.contrib.auth.middleware.AuthenticationMiddleware django.contrib.messages.middleware.MessageMiddleware

Jusqu'à présent, les problèmes similaires rencontrés par d'autres personnes semblent être légèrement différents (par exemple, Internet Explorer supprime le point dans l'extension et le remplace par un trait de soulignement).

Une idée de ce qui pourrait se passer ici ? Je suis un peu perplexe.

2voto

Tim Points 88

Notre environnement dispose d'un système de stockage de documents qui contient des documents avec les attributs DocumentName et ContentType. Dans certains cas, le type de contenu est renvoyé avec des espaces ajoutés à la fin de la chaîne, comme "pdf".

Dans Internet Explorer, la sortie tronquerait la fin de la chaîne, tandis que Chrome convertirait les espaces supplémentaires en caractères de soulignement, ce qui me donnerait ce nom de fichier : "fichier.pdf______________".

Pour résoudre ce problème, il suffit de tronquer la chaîne de caractères.

public string getFileName(string docName, string contentType) {
    string fileName = docName + "." + contentType.Trim();

    return fileName;
}

1voto

Joel B Points 637

J'ai enfin compris ce qui se passait ici. L'interface utilisateur qui était utilisée pour déclencher le téléchargement le faisait en créant une balise d'ancrage temporaire (voir la deuxième réponse ici) : Télécharger le fichier url des données ). Ce faisant, elle a eu deux cas différents. Dans un cas, s'il téléchargeait plusieurs fichiers, il changeait l'extension de fichier en .zip. Dans un autre cas, si le téléchargement d'un seul fichier, il essayait toujours d'ajouter une extension, mais la façon dont le code de l'interface utilisateur était écrit, il définissait l'extension comme une chaîne vide. Le résultat final est donc l'ajout d'un point, mais aucune extension après cela. Par exemple, si le fichier téléchargé était "test.txt", il devenait "test.txt.", qui était ensuite converti par Chrome en "test.txt_", sous Windows, pour en faire une extension de fichier valide.

0voto

Raskolnikov Points 704

Ma solution en ASP.NET core

[HttpGet("pdf/{fileId}")]
public IActionResult GetPdfFile([FromRoute]int fileId)
{
    var result = Repo.GetFile(fileId);
    Response.Headers.Add("Content-Disposition", $"inline; filename={result.FileName}");
    return File(result.Data, "application/pdf");
}

0voto

Share IT Code Points 1

J'ai résolu ce problème en remplaçant l'espace blanc dans le nom du fichier par un caractère tel que - .

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