Delphi XE2 DataSnap - Télécharger le Fichier via TStream Avec Barre de Progression
J'ai écrit un serveur DataSnap méthode qui retourne un TStream objet le transfert d'un fichier. Le client de l'application appelle la méthode et lit le flux d'amende. Mon problème est que l'appel de la méthode prend un certain temps avant de le TStream objet est disponible à la lecture, mais sur le côté serveur, je peux voir que l'appel de la méthode ne prend qu'une seconde pour créer l'objet de retour. J'espérais que l'objet de flux de données serait retourné immédiatement afin que je puisse lire le flux et afficher une barre de progression pour la progression du téléchargement. Est-il un autre moyen que je peux faire?
Le serveur de la méthode est très simple :
function TServerMethods.DespatchDocument(sCompanyID, sDocOurRef: string): TStream;
var
sSourceFilePath: string;
strFileStream: TFileStream;
begin
sSourceFilePath := GetDocumentPDFFilePath(sCompanyID, sDocOurRef);
strFileStream := TFileStream.Create(sSourceFilePath, fmOpenRead);
Result := strFileStream;
end;
OriginalL'auteur Jonathan Wareham | 2012-01-17
Vous devez vous connecter pour publier un commentaire.
C'est la façon dont je l'ai fait il y a quelques temps. J'ai utilisé XE et n'ont pas eu la chance de le nettoyer.
//Côté serveur:
//Côté Client:
Vous pouvez ajuster BufSize toutefois vous le souhaitez. J'ai eu de la difficulté à obtenir la taille du flux jusqu'à ce que j'ai fait de cette façon. J'ai expérimenté avec XE2 et ne semblent pas avoir le même problème, mais j'étais le téléchargement. Il y a sans doute une meilleure façon de récupérer la taille du cours d'eau. Si je reçois la réponse bientôt, je vais vous laisser savoir....
Sur une autre note -, je n'ai pas trouvé comment afficher une barre de progression sur le côté serveur. Je suis encore à essayer de comprendre cela.
J'espère que cela aide! Laissez-moi savoir si vous avez des questions!
Le fichier que je suis en essais avec un peu moins de 5 mégas. J'ai créé le même DataSnap méthode que vous avez, et l'appel de méthode est de prendre environ 40 secondes pour se terminer avant que le client peut lire le flux avec une barre de progression. Actuellement, je suis juste en utilisant le port 8080 sur HTTP, à l'aide de la TDSRESTConnection d'appeler le DataSnap méthode. Comment êtes-vous de la connexion à la DataSnap service?
Je n'ai pas eu la chance de voir DataSnap REST capacités encore. Je me connecte sur TCP à l'aide de la valeur par défaut 211 port et le client TSQLConnection. L'application j'ai eu du mal avec, je défini sur le port 9999 (et d'une autre application pour 9998) et les problèmes ont disparu. Je pense que c'était mon fournisseur d'accès internet du mécanisme du filtre. Une autre chose - je suis en utilisant XE2 mise à Jour 3. Avez-vous cela? Vous de faire quelque chose avec JSON? J'ai eu à résoudre un certain nombre de choses avec elle aussi, mais je ne peux pas l'image qu'il affecte votre téléchargement. Si vous avez un petit échantillon, je vais construire et de voir si j'ai le même problème.
BTW - je pourrais ajouter mon projet actuel est de le faire avec la sécurité. Il semble fonctionner parfaitement, mais je ne l'ai pas dans produit encore. Et une autre pensée - Mon Cycle de vie des biens de la TDSServerClass est mis à la Session.
Salut, OK, ce doit être un RESTE de la chose. J'ai créé un nouveau Delphi DS client qui se connecte avec TSQLConnection (DBExpress) au lieu de TDSRESTConnection à la même serveur DS et devinez quoi - l'appel de la méthode retourne le flux dans un délai de 1 seconde. Le truc, c'est le client cible de l'application, je suis en train d'écrire est pour Android et Java de la classe proxy que j'ai n'a pas d'équivalent TSQLConnection, seulement un TDSRESTConnection. Besoin de comprendre si il y a une façon de faire RESTE le même comportement pour la diffusion de fichiers ou si c'est juste la façon en raison de son architecture.
OriginalL'auteur aknapple
Heureux que vous avez de la chance! C'est l'autre correctif que j'avais à faire. Vous pouvez vous référer à ce lien https://forums.embarcadero.com/thread.jspa?threadID=66490&tstart=0
Après la plongée dans le code que j'ai trouvé dans "des Données.DBXJSONReflect.pas"
procédure TJSONPopulationCustomizer.Préremplir(Data: TObject; rttiContext: TRttiContext);
...
...
Je pense qu'il devrait être de cette façon:
OriginalL'auteur aknapple