2017-10-01 3 views
0

Objectif: Voulez-vous télécharger un fichier PDF à partir du serveur en générant l'URL ci-dessous: http://localhost:4200/bookStore/secured/rest/books/14119Erreur interdite (type de contenu vide) | Bien que le téléchargement d'un fichier PDF à partir du serveur de Braise

L'URL est généré lorsque la ligne ci-dessous est exécuté dans les book.js dans les routes.

return this.store.findRecord('book', bookId); 

Mais j'obtiens 403 erreur interdite. L'erreur dans les détails:

Error: Ember Data Request GET /bookStore/secured/rest/books/14119 returned a 403 
Payload (Empty Content-Type) 
Forbidden 
    at new AdapterError (-private.js:3170) 
    at Class.handleResponse (rest.js:594) 
    at ajaxError (rest.js:956) 
    at Class.hash.error (rest.js:623) 
    at fire (jquery.js:3317) 
    at Object.fireWith [as rejectWith] (jquery.js:3447) 
    at done (jquery.js:9274) 
    at XMLHttpRequest.<anonymous> (jquery.js:9514) 

Dois-je définir le type de contenu comme 'application/pdf'? et si oui, alors s'il vous plaît suggérer comment le définir.

Ci-dessous est le code JS:

routes \ book.js

actions: { 
    pdfClick(bookId) { 
     return this.store.findRecord('book', bookId); 
    } 
} 
modèle

\ book.hbs

<button {{action "pdfClick" book.bookId}}>PDF</button> 

Dans le côté serveur, le code qui reçoit et répond le la demande est la suivante:

@GET 
@Path("/{bookId}") 
@Produces("application/pdf") 
public Response bookExport(@PathParam("bookId") long bookId) { 
    //Code 
} 

Selon le code du serveur, nous obtenons un fichier PDF du serveur. Ceci est testé avec succès avec PostMan.

Répondre

6

Il semble que vous essayez d'utiliser Ember Data pour télécharger le fichier PDF. Les données Ember sont principalement destinées à gérer les données JSON, donc ce n'est peut-être pas la meilleure solution dans ce cas. Vous pouvez toujours continuer à utiliser Ember Data pour tout le reste, mais pour télécharger le PDF, je vous recommande de ne l'utiliser que pour générer l'URL correcte.

Vous devriez être en mesure de générer l'URL à peu près comme ceci:

let url = this.store.adapterFor('book').urlForFindRecord(bookId, 'book'); 

ou tout simplement:

let url = `http://localhost:4200/bookStore/secured/rest/books/${bookId}`; 

si vous ne souhaitez pas utiliser les données pour Ember du tout.

Enfin pour télécharger le PDF, vous pouvez utiliser:

document.location.assign(url); 

ou convertir votre bouton pour un lien:

<a href={{url}}>Download PDF</a> 
+0

Merci pour la réponse @TBieniek. Avec ce 'let url = this.store.adapterFor ('livre'). UrlForFindRecord (bookId, 'book');' J'ai obtenu l'URL souhaitée.Mais comment déclencher l'URL à partir du fichier hbs. Veuillez noter que: '' C'est ici que la fonction pdfClick est appelée et que l'URL est générée. Comment utiliser l'URL dans le hbs pour le déclencheur. Je essayé: ' PDF' & ' PDF' il va à la fonction mais ne déclenche pas l'URL après. –

+0
0

Vous faites une demande de http://localhost:4200/bookStore/secured/rest/books/14119, mais c'est le serveur de développement Ember . Si vous utilisez des données de braises, vous pouvez personnaliser l'hôte dans l'adaptateur. Voir this section of the documentation pour savoir comment faire.

Notez que Données Ember ne sait pas comment traiter automatiquement les fichiers PDF. Si vous voulez juste le télécharger, je suggère simplement de le lier directement avec un <a href="location of pdf file".

0

Vous souhaitez récupérer un fichier binaire (pdf) en réponse à un appel de repos. Vous avez plusieurs options différentes:

La première est la même avec l'approche <a href={{url}}>Download PDF</a> de TBienek.Je pense que c'est la solution simpliste et multi-navigateur. Cela éliminera le besoin de se reposer.

La deuxième est d'envoyer des octets de pdf dans un objet JSON tels que:

{ 
    content:'<base64 encoded byte arr>', 
    filename:'<string>, 
    contentType: 'application/pdf' 
} 

Après cela créer un Blob avec content et déclencheur pour l'ouvrir (via window.open).

Il existe également une troisième alternative utilisant XMLHttpRequest sans changer votre point de terminaison de serveur actuel. Utilisez le response de XMLHttpRequest comme content dans la deuxième option.

Aucun d'eux n'a utilisé les données Ember.