2010-10-30 15 views
0

J'ai lutté pendant quelques heures maintenant avec le service jpg avec un site python cgi. Pour une raison quelconque, les images sont toujours déformées.python/cgi - sert des images déformées

Voici mon code:

print('Content-type: image/jpg\n') 
path = 'C:\\Users\\Admin\\Documents\\image.jpg' 
print file(path, 'rb').read() 

This post décrit un problème presque identique, mais je ne suis pas en utilisant WSGI. J'utilise Windows et Apache et ai joué avec \r\n\r\n ainsi que print 'Content-type: image/jpg\r\n\r\n',. De même j'ai essayé print file(path, 'rb').read(), en pensant qu'une nouvelle ligne pourrait déformer l'image en quelque sorte.

D'autres idées de dépannage?

Merci, Josh

ps. Le site doit rester un site cgi.

[modifier] changé pour print('Content-type: image/jpeg\n')

[modifier] Exemple d'image: alt text

+1

* Déformé *? Comment? –

+1

Le type MIME pour les JPEGs est 'image/jpeg' pas' image/jpg' – Quentin

+0

merci mais cela ne le résout pas – joshs

Répondre

2

This article montre l'envoi d'un fichier à CGI en C++. Le programme prend quelques précautions pour convertir stdout en binaire:

int main() 
{ 
#if _WIN32 
    // Standard I/O is in text mode by default; since we intend 
    // to send binary image data to standard output, we have to 
    // set it to binary mode. 
    // Error handling is tricky to say the least, so we have none. 
    _fmode = _O_BINARY; 
    if (_setmode(_fileno(stdin), _fmode) == -1) {} 
    if (_setmode(_fileno(stdout), _fmode) == -1) {} 
#endif 

Vous pouvez le faire en python. Here est une solution spécifique Windows:

import sys 

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

Here est un code spécifique à 3.x python:

Les flux standards sont en mode texte par défaut. Pour écrire ou lire des données binaires , utilisez le tampon binaire sous-jacent. Par exemple, pour écrire octets sur stdout, utilisez sys.stdout.buffer.write (b'abc '). Utilisation de Les flux io.TextIOBase.detach() peuvent être rendus binaires par défaut. Cette fonction ensembles stdin et stdout binaire:

def make_streams_binary(): 
    sys.stdin = sys.stdin.detach() 
    sys.stdout = sys.stdout.detach() 

plus tard: Je pense aussi que vous devriez être en mesure de UU64-encoder votre jpeg et l'envoyer sur le fil sous forme de texte avec un contenu approprié -length et content-type, mais je n'ai jamais fait de HTTP à ce niveau. Vous devriez le chercher.