Flux rss
Collection CommentÇaMarche.net
Rechercher : dans
Par :

[CGI][Python] Problème avec fichiers binaires

sebsauvage, le lundi 30 juin 2003 à 17:46:28 
 Signaler ce message aux modérateurs

Hello eveuriouane.

J'ai un petit soucis que je n'arrive pas à résoudre.

Je bricole des CGI Python avec TinyWeb (un petit serveur web sous Windows).

Le CGI suivant fonctionne bien:

import sys

import cgitb; cgitb.enable()
print 'Content-Type: text/html'
print
sys.stdout.write("Hello, world !")


Le CGI suivant fait la même chose, mais en envoyant un fichier:
import sys

import cgitb; cgitb.enable()
print 'Content-Type: application/octet-stream'
print
data = open('toto.zip','rb').read()
sys.stdout.write(data)


Ce que je ne comprend pas, c'est que je reçois bien le fichier toto.zip, mais que tous les retour-chariots sont convertis ! (OA --> OD OA).
Du coup ça casse tout mes fichiers binaires.

J'ai essayé avec IE et Mozilla: même chose.

Est-ce que c'est une subtilité de TinyWeb ?
Ou bien un truc que j'aurais raté en Python ?

Si vous avez une idée, je suis preneur...

1

batmat, le mardi 1 juillet 2003 à 09:02:58

Ca me rappelle le protocole ftp en mode texte... Pourtant, ça n'a rien à voir ?!?

@++

Vous hésitez entre Linux et Windows ?
Vous voulez dépenser du temps ou de l'argent ? :-D

Répondre à batmat

2

sebsauvage, le mardi 1 juillet 2003 à 09:11:33

ça n'a effectivement rien à voir !
Pourtant ça se comporte comme le transfer ASCII du FTP.

J'ai aussi vérifié le accept encoding.

Je vais essayer avec un autre serveur web pour voir si ça vient du serveur web, ou du fait que c'est un CGI qui tourne sous Dos.

Répondre à sebsauvage

3

sebsauvage, le mardi 1 juillet 2003 à 09:28:51

Arf... ça fait la même chose avec Sambar.

'comprend pas.

Répondre à sebsauvage

4

sebsauvage, le mardi 1 juillet 2003 à 15:00:56

Ayé. J'ai trouvé.

Sous tous les Unix, stdout est ouvert en mode binaire.
Mais pas sous Windows.
Il faut donc forcer stdout en mode binaire.
Le CGI devient:


import sys

import cgitb; cgitb.enable()

if sys.platform == "win32":
import os, msvcrt
msvcrt.setmode(sys.stdout.fileno(), os.O_BINARY)

sys.stdout.write('Content-Type: application/octet-stream\r\n')
sys.stdout.write('\r\n')
data = open('toto.zip','rb').read()
sys.stdout.write(data)


Et ça marche !
Ouf.

(Référence: http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/65443 )

Répondre à sebsauvage

5

lof., le mardi 1 juillet 2003 à 15:05:55

Bonjour,
c'est bien ce que je pensais, la seule personne à pouvoir répondre à une tel question était seb lui même.....
lof.

Répondre à lof.

8

sebsauvage, le mardi 1 juillet 2003 à 15:34:23

Merci, je suis flatté : )

Répondre à sebsauvage

6

batmat, le mardi 1 juillet 2003 à 15:12:08

Alors, là moi j'ai une question que je me pose depuis quelques temps : à quoi est censé servir cette foutue ouverture en mode texte ou en mode binaire ? A part emmerder le monde dans ce genre de cas ?!?

@++

Vous hésitez entre Linux et Windows ?
Vous voulez dépenser du temps ou de l'argent ? :-D

Répondre à batmat

7

sebsauvage, le mardi 1 juillet 2003 à 15:34:05

Oui ça me semble éminemment débile.
Au moins sous Unix on a pas de genre de problème.

Accessoirement, je me demande pourquoi MS-Dos et Windows ont adopté 0D 0A comme retour à la ligne. Comme si 0A ne suffisait pas !

Répondre à sebsauvage

9

Marden, le mardi 1 juillet 2003 à 15:52:50

Vous semblez ignorer les "raisons historiques" où l'usage du <line feed> et du <carriage return> permettaient de commander séparément le changement de ligne (sans retour à la ligne) et le retour à la ligne proprement dit (2 actions mécaniques distinctes) sur les télétypes. L'assimilation des 2 opérations à une seule est venue venue plus tard, mais ce n'est qu'une convention. Je n'apprendrai à personne - mais il faut pourtant parfois le rappeler - que l'informatique n'a avancé qu'à petits pas, avec le souci pour certains de veiller ... à la "compatibilité ascendante" ! Il y a des choses dont il ne faut pas forcément s'étonner et pour lesquelles les critiques sont sans intérêt.

Répondre à Marden

10

sebsauvage, le mardi 1 juillet 2003 à 16:26:05

Ah oui, c'est vrai.
C'est vrai que cette opération était nécessaire sur les imprimantes à aiguilles.

Et étant donné que le gestionnaire d'impression du Dos était une bête redirection vers prn: (ou lpt1:), je comprend mieux la raison du choix.
( pour imprimer avec un simple TYPE fichier.txt > prn: )

Mais cela ne me semble plus justifiable sous Windows.
La console devrait être ouvert par défaut en mode binaire.
(Je comprend mieux pourquoi on utilise si peu les pipes sous Windows...)

Répondre à sebsauvage

11

 batmat, le mardi 1 juillet 2003 à 17:00:25

Je suis un peu comme seb : "plsu justifiable" => Unix existe depuis aussi longtemps (enfin plus) que windows et ce problème n'existe plus depuis belle lurette (ouvrez toujours en mode texte, il s'en tamponne, il ouvre en binaire ;p)

C'est vrai aussi que ce pb me rappelle certaines turpitudes :) : qui n'a jamais imprimé "en escalier" :-)

@++

Vous hésitez entre Linux et Windows ?
Vous voulez dépenser du temps ou de l'argent ? :-D

Répondre à batmat
[Java] Fichier binaire (Résolu) Bonjour, J'ai un problème en Java, j'aimerais avoir votre avis ! Je dois faire un éditeur capable d'enregistrer le texte que l'utilisateur a entré à la suite d'un fichier binaire... Mais ça fait pas mal de temps que je me creuse la tête, et je vois... www.commentcamarche.net/forum/affich-6375205-java-fichier-binaire
Fichiers binaire/texte/ascii Comment reconnait-on un fichier binaire d'un fichier texte ? et un fichier texte ascii (7 bit) d'un autre (8bit) sous linux ou windows ? peut-on le savoir avec php ? merci www.commentcamarche.net/forum/affich-70911-fichiers-binaire-texte-ascii
Fichier binaire en C Slt a tous.J'ai un petit probleme sur les fichiers binaires.Je dois inserer dans un fichier binaire une structure mais celle ci triée.J'arrive a trouver la position pour inserer la structure mais lorsque je fais un fwrite a cet endroit il m'efface ce... www.commentcamarche.net/forum/affich-720381-fichier-binaire-en-c
Parser un fichier binaire en PHPSupposons que vous ayez enregistré des données binaires dans un fichier, c'est-à-dire un enregistrement brut qui n'est pas traduit en texte. C'est une chose que l'on fait couramment avec certains langages de bas niveau comme le C ou le... www.commentcamarche.net/faq/sujet-13092-parser-un-fichier-binaire-en-php
[Shell] Affichage d'un fichier binaire: Terminal illisibleLorsque vous affichez par mégarde le contenu d'un fichier binaire (par exemple cat /bin/mount | more), il peut arrivé que le terminal affiche des caractères non imprimables, ce qui provoque un affichage totalement illisible avec des caractères... www.commentcamarche.net/faq/sujet-972-shell-affichage-d-un-fichier-binaire-terminal-illisible
[Gravure] Graver ou lire un fichier .BIN / .CUELes fichiers .bin et .cue sont respectivement : .BIN : une image de CD, c'est-à-dire une copie binaire d'un CD ou d'un DVD sous forme d'un fichier .CUE : informations sur les pistes du disque. Les fichiers .BIN / .CUE sont utilisables par... www.commentcamarche.net/faq/sujet-2963-gravure-graver-ou-lire-un-fichier-bin-cue
[Visual Basic] conversion fichier binaireBonjour, je souhaite convertir un fichier binaire (extension: .ogf) en fichier excel. J'ai trouvé une fonction qui me permet de convertir les octets lus et elle marche. Mon problème c'est que lorsque je lis mon fichier(par paquet de 32 bits) et que je... www.commentcamarche.net/forum/affich-3032263-visual-basic-conversion-fichier-binaire
Comment lire des fichiers binairesJ'ai un jeu (warlords battlecry 2) dans lequel j'aimerai changer des données ,l'extension du fichier correspondant est .xcr , j'ai essayé de l'ouvrir avec vb et java (lecture de fichier en mode binaire) mais ça ne marche pas je crois qu'il ecrit en... www.commentcamarche.net/forum/affich-75102-comment-lire-des-fichiers-binaires
Problème lecture fichier binaire Fluent MatlaBonjour, J'ai un soucis quand à la lecture d'un fichier binaire. Rapidement, je vous explique ma simulation : j'effectue une simulation numérique d'une marche descendante en diphasique. J'ai tout d'abord crée et simulé une conduite avec des conditions... www.commentcamarche.net/forum/affich-12786505-probleme-lecture-fichier-binaire-fluent-matla
Fichier DATFormat DAT Un fichier DAT Un fichier .dat est un fichier de données (.DAT signifie data). En général, il s'agit d'un fichier binaire, créé par un programme et utilisable uniquement par ce programme, ce qui signifie qu'il n'est pas censé être ouvert... www.commentcamarche.net/contents/fichier/dat.php3
Introduction à la programmation des CGIPrésentation de l'interface CGI Un script CGI (Common Gateway Interface, traduisez interface de passerelle commune) est un programme exécuté par le serveur web (on dit généralement « côté serveur »), permettant d'envoyer au navigateur de... www.commentcamarche.net/contents/cgi/cgiintro.php3
Fichier BINFormat BIN Les fichiers BIN et CUE sont respectivement : .BIN : une image de CD, c'est-à-dire une copie binaire d'un CD ou d'un DVD sous forme d'un fichier .CUE : informations sur les pistes du disque. Comment lire un fichier BIN ? Les... www.commentcamarche.net/contents/fichier/bin.php3