4

我们有一个test.py应该在同一个浏览器中显示一个.png文件和文件。.txt下面是我的代码:

print "Content-type: image/png\n"
print file(r"/var/www/cgi-bin/testpie.png", "rb").read()
myurl = "file://var/www/html/test.txt"

webbrowser.open(myurl)

但我.png在浏览器中只得到文件。那么如何使用python在浏览器中显示两者?

4

3 回答 3

4

浏览器显示 HTML 文档。HTML 文档可以在div, span,p等标签中包含文本,只需将文本包含在元素中即可。例如,<div>Hello!</div>显示文本Hello。但它们不直接包含图像;相反,它们包含指向图像的链接src,作为img标签的 。例如,<img src="http://example.com/foo.png">显示 foo.png 图像。

所以,有两种方法可以做你想做的事。


最简单的方法是公开两个资源(使用单独的 URL):(1) PNG 图像,以及 (2) 包含指向 PNG 图像的链接(并直接包含文本)的 HTML 页面。

比如……</p>

testpie_image.py:

print "Content-type: image/png\n"
print open(r"/var/www/cgi-bin/testpie.png", "rb").read()

测试派.py:

print """Content-type: text/html

<html><head></head><body>
<img src="testpie_image.py" />
<div>{}</div>
</body></html>
""".format(open(r"/var/www/html/test.txt").read())

现在,如果有人浏览到http://example.com/cgi-bin/testpie.py,那将触发您的第二个脚本,因此他们将获得如下 HTML 页面:

<html><head></head><body>
<img src="testpie_image.py" />
<div>Blah blah this is my text file.</div>
</body></html>

然后,他们的浏览器将按照该链接指向http://example.com/cgi-bin/testpie-image.py,这将触发您的第一个脚本,因此他们将获得 PNG 图像。


更难的方法是使用一种称为 的特殊 URL 方案data:,它可以让您将数据嵌入内联,就好像它是指向单独资源的链接一样。您必须做更多的工作才能嵌入它,但这意味着您只需要一个 URL 而不是两个:

print """Content-type: text/html

<html><head></head><body>
<img src="data:image/png;base64,{}"</img>
<div>{}</div>
</body></html>
""".format(open(r"/var/www/cgi-bin/testpie.png", "rb").read().encode("base64"),
           open(r"/var/www/html/test.txt").read())

现在,当有人浏览 时http://example.com/cgi-bin/testpie.py,他们会得到一个这样的 HTML 页面:

<html><head></head><body>
<img src="data:image/png;base64,1Ab…
Z2y" />
<div>Blah blah this is my text file.</div>
</body></html>

嗨,我正在从 html 文件中执行 python 文件,当我在文本框中输入一些关键字并单击提交时,它将执行 python 文件。所以python文件生成两个文件1).png和2)文本文件。所以我的要求是当我在 html 中单击提交时,立即在网络浏览器中显示 .png 和 .txt 文件。

好的,让我解释一下。

我假设您正在使用连接到传统 CGI 服务器的传统表单提交。当您在 Web 浏览器中单击提交按钮时,这会向构建 HTML 文档的 CGI 脚本发送一个请求。该文档包含文本文件,还包含链接到第二个 CGI 脚本的图像。您的 Web 浏览器通过点击第二个 CGI 的链接自动加载图像,该 CGI 生成并返回 PNG 文件,该文件将被显示。因此,您可以在一个浏览器页面中看到图像和文本。


最后一件事:您可能不想将文本文件放在 /var/www 层次结构中,如果您使用的是data:URL,您可能也不希望将图像文件放在那里。

于 2013-04-15T10:23:19.720 回答
1

如果要显示两种类型的数据,则需要:

  • 有两个单独的 HTTP 请求
  • 使用一种可以嵌入另一种的数据格式(例如,HTML 代替文本,将 PNG 作为 URI 嵌入data:方案)。

您不能同时返回文本文档和 PNG 图像。

于 2013-04-15T09:46:27.543 回答
0

您可以使用 Python 创建一个包含文本和图像内容的简单 HTML 文件,然后在浏览器中打开该文件。

于 2013-04-15T10:05:42.090 回答