IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

ASP.NET Discussion :

PDF corrompu après upload


Sujet :

ASP.NET

  1. #1
    Membre à l'essai
    Inscrit en
    Avril 2008
    Messages
    35
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 35
    Points : 16
    Points
    16
    Par défaut PDF corrompu après upload
    Bonjour,

    Nous avons un petit site intranet qui permet à des utilisateurs d'uploader des PDF dans un dossier public Exchange 2003.

    Le site fonctionne globalement de la manière suivante:

    - L'utilisateur créée un PDF pdfCreator ou office 2012...)
    - Il met ensuite ce PDF dans un dossier public temporaire (je sais ce n'est pas simple)
    - Il va sur le site intranet dans la section upload
    - Le site détecte tous les PDF présents dans le dossier temporaire
    - L'utilisateur sélectionne le PDF qu'il veut uploader
    - Upload le PDF dans le dossier public et efface le pdf du dossier temporaire

    Bien entendu, si dans le dossier public final il existe déjà un PDF, il est remplacé.

    Maintenant, voici le problème:

    Sous Windows XP, IE8, pas de problème.
    Sous Windows 7, IE8 (même version), le PDF est uploadé mais lorsqu'on veut le lire il est corrompu.
    Il manque en fait la fin du PDF, le trailer.

    Un avis là dessus?

    Pour info, voici en gros le code:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
     
    '========================================
    '= Récupération de la taille du fichier =
    '========================================
    Set FSO = Server.CreateObject("Scripting.FileSystemObject")
    Set fich = FSO.GetFile(dirtemp & "\" & file)
    taille = fich.size
    		'==============================================================
    		'= récupération du pointeur sur l'ancienne version du fichier =
    		'==============================================================
    		If FSO.FileExists(dirdocpubl & "\" & file) Then
    			Set fichOld = FSO.GetFile(dirdocpubl & "\" & file)
     
    			'=====================================
    			'= Suppression de l'ancienne version =
    			'=====================================
    			fichOld.Delete
     
    			Set fichOld = Nothing
    		End If
     
     
     
    fich.Copy (dirdocpubl)
    fich.Delete

  2. #2
    Modérateur
    Avatar de roro06
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    1 480
    Détails du profil
    Informations personnelles :
    Âge : 54
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 1 480
    Points : 1 978
    Points
    1 978
    Par défaut
    Bonjour

    - Il met ensuite ce PDF dans un dossier public temporaire
    pourquoi ne pas le mettre directement dans le repertoire public ? ça réglerait le problème ...

    Sinon : utilises fso.copyfile(source, destination) au lieu de fich.Copy (dirdocpubl)


    N'oubliez pas de consulter les FAQ ASP et les cours et tutoriels ASP

    " La vie c'est quelque chose de très fort et de très beau.... La vie appartient a tous les vivants. It's both a dream and a feeling. C'est être ce que nous ne sommes pas sans le rester. La vie c'est mourir aussi....Et mourir c'est vraiment strong...c'est rester en vie au delà de la mort...Tous ceux qui sont morts n'ignorent pas de le savoir."
    (J.C. VanDamme, humoriste et philosophe belge . A moins que ce ne soit l'inverse ...)

    Chuck Norris comprend JC Van Damme.

  3. #3
    Membre à l'essai
    Inscrit en
    Avril 2008
    Messages
    35
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 35
    Points : 16
    Points
    16
    Par défaut
    Bonjour,

    Parce qu'il y a un formulaire que les utilisateurs doivent remplir avant l'upload et qui renseigne une BDD (incrémentation de versions, commentaires...).

    Ce site est un vieux site fait en 2005, voir avant... et il fait un peu ce que SharePoint fait maintenant...

    Je n'ai pas le droit de modifier le site, il y a une équipe DEV (mais peu connaissent ASP).


    J'ai pensé à modifier la méthode pour copier.. mais pourquoi le code marcherait sur XP et plus sous Windows 7, comme si tout le fichier n'était pas copié.

    J'ai repris le code et j'ai créé un script ASP à part: je n'ai aucun problème pour upload et lire le PDF.
    Je pense donc que le problème n'est pas forcément dans la partie du code qui fait la copie, il doit y avoir quelque chose avant ou après qui corrompt le fichier. Je sais qu'après, il y a du code qui modifie des droits sur le fichier...

    Pour être plus juste, voici le code exact de la page qui exécute l'upload.

    Création c'est lorsqu'il y a un nouveau fichier sans incrémentation de version.

    Modification, incrémentation de la version d'un fichier.

    Il y a juste la partie concernant la variable dirdocpriv que je n'ai pas encore comprise... il est possible que le problème vienne de là.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
     
     
    '==============================
    '= Création ou modification ? =
    '==============================
    Dim creation
    creation = False
    If Request.QueryString("action") = "creation" Then creation = True
    %>
     
    <%
    '========================================
    '= Récupération de la taille du fichier =
    '========================================
    Set FSO = Server.CreateObject("Scripting.FileSystemObject")
    Set fich = FSO.GetFile(dirtemp & "\" & decode(Request.QueryString("nomdoc")))
    taille = fich.size
    %>
     
    <%
    '================================
    '= Gestion physique du document =
    '================================
     
    	'================
    	'= Modification =
    	'================
    	If Not creation Then
     
    		'==============================================================
    		'= récupération du pointeur sur l'ancienne version du fichier =
    		'==============================================================
    		If FSO.FileExists(dirdocpubl & "\" & decode(Request.QueryString("nomdoc"))) Then
    			Set fichOld = FSO.GetFile(dirdocpubl & "\" & decode(Request.QueryString("nomdoc")))
    		Else
    			Set fichOld = FSO.GetFile(dirdocpriv & "\" & decode(Request.QueryString("nomdoc")))
    		End If
     
    		'=====================================
    		'= Suppression de l'ancienne version =
    		'=====================================
    		fichOld.Delete
    		Set fichOld = Nothing
     
    	End If
     
    	'======================================
    	'= Création ou modification : Recopie =
    	'======================================
    	If Request.form("publ") = "publ" Then
    		fich.Copy dirdocpubl & "\" & decode(Request.QueryString("nomdoc"))
    		fich.Delete
    	Else
    		fich.Copy dirdocpriv & "\" & decode(Request.QueryString("nomdoc"))
    		fich.Delete
    	End If
    %>

  4. #4
    Membre chevronné

    Profil pro
    Chef de Projet / Développeur
    Inscrit en
    Juin 2002
    Messages
    599
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Chef de Projet / Développeur
    Secteur : Santé

    Informations forums :
    Inscription : Juin 2002
    Messages : 599
    Points : 2 026
    Points
    2 026
    Par défaut
    Le contexte était complètement différent ; mais sait-on jamais ....
    J'ai eu ce type de problème sur des RTF : tronqués lors d'une copie à travers le réseau.
    Le soucis venait de l'anti-virus.
    --
    vanquish

  5. #5
    Membre à l'essai
    Inscrit en
    Avril 2008
    Messages
    35
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 35
    Points : 16
    Points
    16
    Par défaut
    Citation Envoyé par vanquish Voir le message
    Le contexte était complètement différent ; mais sait-on jamais ....
    J'ai eu ce type de problème sur des RTF : tronqués lors d'une copie à travers le réseau.
    Le soucis venait de l'anti-virus.


    J'ai pensé à ça mais le problème c'est que ça fonctionne depuis mon poste avec une copie du code.

    Et puis apparemment parfois ça fonctionne.

  6. #6
    Membre à l'essai
    Inscrit en
    Avril 2008
    Messages
    35
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 35
    Points : 16
    Points
    16
    Par défaut
    hum

    Je suis perdu car pourquoi tout fonctionnerait sous XP et pas sur 7

  7. #7
    Modérateur
    Avatar de roro06
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    1 480
    Détails du profil
    Informations personnelles :
    Âge : 54
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 1 480
    Points : 1 978
    Points
    1 978
    Par défaut
    Je suis perdu car pourquoi tout fonctionnerait sous XP et pas sur 7
    Parce que ce n'est pas la même version de IIS qui tourne (v6 d'un côté, 7.5 de l'autre). Forcément, scripting.filesystemObject ne doit pas être implémenté de la même manière. De plus, microsoft ne supporte plus ASP classic depuis win7 (et peut-être même vista) .


    N'oubliez pas de consulter les FAQ ASP et les cours et tutoriels ASP

    " La vie c'est quelque chose de très fort et de très beau.... La vie appartient a tous les vivants. It's both a dream and a feeling. C'est être ce que nous ne sommes pas sans le rester. La vie c'est mourir aussi....Et mourir c'est vraiment strong...c'est rester en vie au delà de la mort...Tous ceux qui sont morts n'ignorent pas de le savoir."
    (J.C. VanDamme, humoriste et philosophe belge . A moins que ce ne soit l'inverse ...)

    Chuck Norris comprend JC Van Damme.

  8. #8
    Membre à l'essai
    Inscrit en
    Avril 2008
    Messages
    35
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 35
    Points : 16
    Points
    16
    Par défaut
    Citation Envoyé par roro06 Voir le message
    Parce que ce n'est pas la même version de IIS qui tourne (v6 d'un côté, 7.5 de l'autre). Forcément, scripting.filesystemObject ne doit pas être implémenté de la même manière. De plus, microsoft ne supporte plus ASP classic depuis win7 (et peut-être même vista) .


    Quel rapport ? Le site est hébergé sur un serveur 2003... je ne vois pas en quoi IIS du client changerait quelque chose?

    Sans compter que c'est aussi le serveur qui gère l'upload.

    Le client ne fait que de l'affichage d'infos...

    Je précise le schéma:

    Voilà ce que fait l'utilisateur sur son poste:

    1 - Utilisateur génère un PDF. L'outil n'a pas d'importance car le problème est le même sur plusieurs outils
    2 - Utilisateur place ce PDF dans un dossier public exchange 2003 (Stockage Temp) auquel il a accès
    NB: le fichier n'est pas corrompu à ce moment là !
    3 - Utilisateur se connecte au site web en administrateur
    4 - Il va sur une page qui liste les PDF qui sont dans le dossier Stockage Temp
    5 - Il sélectionne un de ces PDF
    6 - Entre des informations qui seront stockées en BDD sur ce PDF
    7 - Il valide


    Voilà ce qui se passe côté serveur maintenant.
    1 - Si le fichier n'existait pas, il s'agit d'une création, sinon une mise à jour
    2 - Si création, il copie le fichier de Stockage Temp vers un dossier public exchange sur le même serveur appelé Publication
    3 - Si modification, il supprime l'ancien fichier du dossier Publication puis copie le nouveau dans le répertoire Publication
    4 - Suppression du fichier dans Stockage Temp
    5 - Ajout des informations sur le fichier dans une BDD

    Et c'est tout...

    Résultat: les fichiers qui sont mis à jour sont systématiquement corrompus depuis le passage du client vers Windows 7.

    Pour être précis, il manque le trailer du PDF, comme s'il n'était pas allé au bout de l'upload.

  9. #9
    Modérateur
    Avatar de roro06
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    1 480
    Détails du profil
    Informations personnelles :
    Âge : 54
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 1 480
    Points : 1 978
    Points
    1 978
    Par défaut
    Quel rapport ? Le site est hébergé sur un serveur 2003... je ne vois pas en quoi IIS du client changerait quelque chose?
    J'ai dû mal comprendre.

    Tu indiquais :
    J'ai pensé à modifier la méthode pour copier.. mais pourquoi le code marcherait sur XP et plus sous Windows 7, comme si tout le fichier n'était pas copié.
    et également :
    Sous Windows XP, IE8, pas de problème.
    Sous Windows 7, IE8 (même version), le PDF est uploadé mais lorsqu'on veut le lire il est corrompu.
    Il manque en fait la fin du PDF, le trailer.
    De plus, le code posté est exclusivement du code serveur...
    J'en avais déduit, peut-être un peu rapidement, certes, que ton "petit site intranet" était hébergé sur ces systèmes et que tu nous parlais des systèmes serveur (ces systèmes étant tout à fait capable d'héberger ce genre de "petit site intranet"), non des systèmes clients.

    mea culpa, donc

    Le site est hébergé sur un serveur 2003
    C'est nouveau. Voilà une info qu'il était peut-être temps de dévoiler...

    - Il met ensuite ce PDF dans un dossier public temporaire (je sais ce n'est pas simple)
    Question : il est où, le dossier public temporaire? sur le serveur? sur le client? une troisième machine ? sous quel système?

    Sinon, j'ai une question probablement idiote : c'est quoi, le trailer?


    N'oubliez pas de consulter les FAQ ASP et les cours et tutoriels ASP

    " La vie c'est quelque chose de très fort et de très beau.... La vie appartient a tous les vivants. It's both a dream and a feeling. C'est être ce que nous ne sommes pas sans le rester. La vie c'est mourir aussi....Et mourir c'est vraiment strong...c'est rester en vie au delà de la mort...Tous ceux qui sont morts n'ignorent pas de le savoir."
    (J.C. VanDamme, humoriste et philosophe belge . A moins que ce ne soit l'inverse ...)

    Chuck Norris comprend JC Van Damme.

  10. #10
    Membre à l'essai
    Inscrit en
    Avril 2008
    Messages
    35
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 35
    Points : 16
    Points
    16
    Par défaut
    J'ai dis que ce dossier temp est un dossier public exchange 2003, comme celui de destination.

    Le trailer c'est une composante d'un document PDF qui se trouve souvent à la fin.

    Tu ne le vois qu'en ouvrant le PDF dans un éditeur de texte.

    Voici le trailer d'un fichier corrompu
    0 13
    0000000000 65535 f
    0000002488 00000 n
    0000004718 00000 n
    0000002429 00000 n
    0000002287 00000 n
    0000000015 00000 n
    0000002267 00000 n
    0000002591 00000 n
    0000002773 00000 n
    0000002553 00000 NUL NUL NUL NUL NUL...

    Voici le trailer du fichier d'origine, non corrompu

    0 13
    0000000000 65535 f
    0000002451 00000 n
    0000004518 00000 n
    0000002392 00000 n
    0000002250 00000 n
    0000000015 00000 n
    0000002230 00000 n
    0000002554 00000 n
    0000002736 00000 n
    0000002516 00000 n
    0000002639 00000 n
    0000002816 00000 n
    0000002887 00000 n
    trailer
    << /Size 13 /Root 1 0 R /Info 2 0 R
    /ID [<C4A449CADD863B6400B09C12295B7441><C4A449CADD863B6400B09C12295B7441>]
    >>
    startxref
    4923
    %%EOF

  11. #11
    Membre à l'essai
    Inscrit en
    Avril 2008
    Messages
    35
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 35
    Points : 16
    Points
    16
    Par défaut
    Bon, apparemment ce problème ne trouvera pas de solution.

    Dingue ça alors que j'ai posé la question sur plusieurs forums.

  12. #12
    Expert éminent
    Avatar de Immobilis
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mars 2004
    Messages
    6 559
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 559
    Points : 9 506
    Points
    9 506
    Par défaut
    Salut,

    Je ne sais pas trop pourquoi ce post est arrivé dans la section .NET s'agissant de code ASP3.

    Cependant, que se passe-t-il si tu ne supprime pas le fichier?

    Les fichiers sont des ressources ("non managées" en .NET) qui peuvent provoquer des comportements inattendus. Même si le code est linéaire, il se peut que la suppression survienne avant que le fichier soit complètement copié.

    A+
    "Winter is coming" (ma nouvelle page d'accueil)

Discussions similaires

  1. Fichier excel corrompu apres copie
    Par jaudurier dans le forum Maven
    Réponses: 6
    Dernier message: 03/07/2007, 10h57
  2. Fichier corrompu après téléchargement HTTP
    Par PP(Team) dans le forum C++
    Réponses: 2
    Dernier message: 26/04/2007, 09h09
  3. [Upload] Redimensionner une image après upload
    Par putubudiarta dans le forum Langage
    Réponses: 2
    Dernier message: 14/01/2007, 12h32
  4. [Upload] Fichier interdit d'accès après upload
    Par Bisûnûrs dans le forum Langage
    Réponses: 2
    Dernier message: 31/03/2006, 00h33
  5. [Upload] Insertion image dans mysql après upload
    Par alexmorel dans le forum Langage
    Réponses: 4
    Dernier message: 20/03/2006, 23h46

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo