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.