De retour CSV .NET contrôleur de Base
Je vais avoir de la difficulté à avoir un .NET API de Base du Contrôleur de point de terminaison de résoudre CSV télécharger. Je suis en utilisant le code suivant qui j'ai tiré à partir d'un .NET 4.5 contrôleur:
[HttpGet]
[Route("{id:int}")]
public async Task<HttpResponseMessage> Get(int id)
{
string csv = await reportManager.GetReport(CustomerId, id);
var response = new HttpResponseMessage(HttpStatusCode.OK);
response.Content = new StringContent(csv);
response.Content.Headers.ContentType = new MediaTypeHeaderValue("text/csv");
response.Content.Headers.ContentDisposition =
new ContentDispositionHeaderValue("attachment") { FileName = "report.csv" };
return response;
}
Quand j'ai frappé à ce point de terminaison de mon Angulaire 4 app, je reçois la réponse suivante écrit dans le navigateur:
{
"version": {
"major": 1,
"minor": 1,
"build": -1,
"revision": -1,
"majorRevision": -1,
"minorRevision": -1
},
"content": {
"headers": [
{
"key": "Content-Type",
"value": [
"text/csv"
]
},
{
"key": "Content-Disposition",
"value": [
"attachment; filename=11.csv"
]
}
]
},
"statusCode": 200,
"reasonPhrase": "OK",
"headers": [ ],
"requestMessage": null,
"isSuccessStatusCode": true
}
Mon espoir est que quand j'ai touché le point de terminaison, l'utilisateur sera invité à télécharger le fichier CSV.
J'ai trouvé cette post sur comment faire pour "export" un CSV .NET de Base. Le problème est que je suis de la récupération de la CSV en mémoire à partir de la source (un seau AWS S3) alors que ce code semble fonctionner seulement lorsque vous avez une IEnumerable<object>
.
Je me demande si mon problème se situe soit en demande ou en-têtes de réponse, où il y a quelque chose de prévenir le navigateur à partir de la récupération d'un fichier CSV à partir de mon API. Voici ce que je vois dans le navigateur de la console:
Un autre avis, dans ces cas souvent préférable d'utiliser outputformatters qui va lire acceptencoding par exemple, ou par d'autres règles. Si vous travaillez sur un gros projet, vous avez probablement besoin d'utiliser l'export csv pour un certain nombre de méthodes et si vous allez créer générique formaté vous éviter des travaux inutiles à l'avenir. Il peut être une couche de middleware
Avez-vous quelque chose à ajouter? Vous reliant à un article qui est référencé dans un lien de mon post n'est pas très utile.
Il semble comme si vous êtes à chercher les télécharger via AJAX. Lorsque vous faites cela, vous devez définir la
responseType
comme arraybuffer
et de créer un blob de la réponse de données dans votre réussite de la méthode. Vous devrez également gérer le téléchargement manuellement, en créant un lien avec ce que les données et en "cliquant" dessus. Rien de ce qui se passe pour vous automatiquement.Dans le réseau de trafic de capture d'écran, j'ai été frappé directement l'URL dans le navigateur.
OriginalL'auteur im1dermike | 2017-10-27
Vous devez vous connecter pour publier un commentaire.
La manière appropriée de la force de télécharger un fichier au lieu de s'afficher en direct est à l'aide de la
Content-Disposition
en-tête de réponse. Tandis que le dessous de la solution fonctionne (voir la documentation) il a été souligné que cela peut avoir des effets secondaires indésirables.Vieille Réponse
Réglage de la
Content-Type
en-tête de réponse àapplication/octet-stream
force de la plupart des grands navigateurs pour inviter l'utilisateur à enregistrer le fichier au lieu de l'afficher dans la fenêtre.Essayer de faire quelque chose comme ceci:
Voir ma réponse à cette question pour plus d'info
À l'aide de
application/octet-stream
est pour les fichiers exécutables commeexe
oubin
... C'est une mauvaise pratique, car elle se brise les standards du web et aura probablement une incidence sur votre application web de façon négative quand il s'agit de robots web et la maintenance à long terme, etc. Il ya une raison pourquoi il y a des standards du web. Vous devez être clair sur le contenu que vous servez à vos clients."Ceci est la valeur par défaut pour un fichier binaire.", pour qui je dirais tout fichier compte. Votre argument contre l'utilisation de ce type de contenu semble assez faible, mais vous n'avez pas tort que c'est une mauvaise pratique. En tout cas, j'ai mis à jour ma réponse avec la réponse correcte en-tête pour être ensemble qui permet d'obtenir le même effet.
Il n'y a que peu de place à une autre interprétation. Un
text/csv
est un texte fichier, pas un binaire fichier... Selon les standards du web, un inconnu fichier texte esttext/plain
-- et -- inconnu fichier binaire estapplication/octet-stream
. Si vous voulez juste une invite de téléchargement, puis revenir unFile
type avec unbyte[]
oustream
. Ne pas entailler avecContent-Types
-- il n'est pas nécessaire.Le traitement d'un fichier texte en tant que binaire n'est pas différent que de traiter un
string
comme unobject
. La facilité de maintenance de l'aideapplication/octet-stream
vstext/plain
est probablement pas pertinent dans le cas des OP cas, comme le sont les robots d'indexation s'il est précisément d'essayer d'inviter l'utilisateur à télécharger le fichier. Ce n'est pas aller à l'encontre de la norme en essayant de faire passer un fichier texte autour de la vidéo, il faut simplement dire: "traite-moi comme l'un blob binaire" qui n'est pas la rupture de toute norme, c'est d'en faire usage.OriginalL'auteur Neil
Solution: Utiliser
FileResult
Ce devrait être utilisé si vous voulez que le client d'obtenir la "Enregistrer le Fichier" boîte de dialogue.
Il existe une variété à choisir à partir d'ici, comme
FileContentResult
,FileStreamResult
,VirtualFileResult
,PhysicalFileResult
; mais elles découlent toutes deFileResult
-- donc, nous allons aller avec celui-là pour cet exemple.Supplémentaire: Content-Disposition
La
FileResult
donnera automatiquement la bonneContent-Disposition
en-tête deattachment
.Si vous souhaitez ouvrir le fichier dans le navigateur ("inline"), au lieu d'inviter l' "Enregistrer le Fichier" boîte de dialogue ("saisie"). Alors vous pouvez le faire en modifiant le
Content-Disposition
valeur d'en-tête.Prendre pour exemple, nous voulons montrer la
PDF
fichier dans le navigateur.Du crédit à cette DONC Réponse
Formateurs Personnalisés
Formateurs personnalisés est un excellent choix en général, parce qu'il permet au client de demander le type qu'ils veulent les données, telles que les plus populaires JSON ou moins populaires de XML.
Cela fonctionne principalement par la signification du contenu tel que spécifié dans le
Accept
en-tête que le client transmet au serveur, tels que CSV, XLS, XML, JSON, etc.Puisque vous utilisez le type de format de
"text/csv"
- actuellement, il n'y a pas d'entrée/sortie module de formatage pour cela lorsque vous utilisez le pré-livré des options telles queAddMvc()
... Donc, vous devrez ajouter, comme:Très Simple De Mise En Forme Personnalisée
Ici est une version très basique d'une mise en forme personnalisée, qui est un stripped-down la version qui vous a été fourni avec le Microsoft Docs exemple.
De forcer un Format Particulier
Pour plus d'informations, je vous recommande de lire:
il y avait une faute de frappe. Il a été corrigé.
OriginalL'auteur Svek