当前位置: 首页 > 面试题库 >

如何从服务器发送png图像以通过ajax在浏览器中显示

朱自明
2023-03-14
问题内容

我一直很难完成必须完成的一项非常正常的任务。我将图像上传并保存到Web服务器,并将该文件的路径保存在MySQL数据库中(这一切正常)。不起作用的是从服务器获取图像文件,并通过ajax在页面上显示它。

最初,我只是尝试从数据库中检索路径,并src使用图像的路径更新标签的属性。这是可行的,但是所有映像都位于服务器上的文件夹中,所有人都可以访问它们。不是很好。我只能让这些用户访问属于某些用户的图片。

为了限制对这些照片的访问,我在该文件夹上添加了一个Apache指令,该指令成功地限制了访问。然后,问题变成了我无法通过将src属性设置为该路径来在浏览器中显示图像。见我的帖子:https :
//serverfault.com/questions/425974/apache-deny-access-to-images-folder-but-
still-still-able-to-display-via-img-on-
site

最终,我了解到必须使用PHP直接从服务器读取图像数据并将其发送到浏览器。我使用过file_get_contents()函数,该函数可将服务器上的图像文件(PNG)转换为字符串。我通过ajax调用将该字符串返回给浏​​览器。我无法获得的是:
如何使用JavaScript将字符串转换回图像?

参见以下代码:

$.ajax({
    url: get_image.php,
    success: function(image_string){
        //how to load this image string from file_get_contents to the browser??
    }
});

问题答案:

您可以向禁止访问该图像的用户显示默认的“禁止访问”图像:

<?php

$file = $_GET['file']; // don't forget to sanitize this!

header('Content-type: image/png');
if (user_is_allowed_to_access($file)) {
    readfile($file);
}
else {
    readfile('some/default/file.png');
}

并且,在客户端

<img src="script.php?file=path/to/file.png" />

另外,如果您确实希望或需要通过Ajax发送数据,则可以对Base64进行编码:

<?php

echo base64_encode(file_get_contents($file));

img使用数据URI方案将响应放入标签中

var img = '<img src="data:image/png;base64,'+ server_reponse +'"/>';

假设Base64编码的数据明显大于原始数据,则可以发送原始数据并使用library在浏览器中对其进行编码。

这对您有意义吗?



 类似资料:
  • 问题内容: 我有一个运行着Jersey REST资源的Web服务器,我想知道如何获取浏览器img标签的image / png参考;提交表单或获得Ajax响应后。用于添加图形的图像处理代码正在运行,只需以某种方式返回即可。 码: 干杯 问题答案: 我不认为在REST服务中返回图像数据是一个好主意。它占用了应用程序服务器的内存和IO带宽。最好将任务委派给针对这种传输进行了优化的适当的Web服务器。您可

  • 问题内容: TL; DR; 上传之前,有没有一种方法可以直接在浏览器端压缩图像(主要是jpeg,png和gif)?我很确定JavaScript可以做到这一点,但是我找不到实现它的方法。 这是我要实现的完整方案: 用户访问我的网站,然后通过元素选择图片, 该图片是通过JavaScript检索的,我们进行了一些验证,例如正确的文件格式,最大文件大小等, 如果一切正常,则会在页面上显示图像的预览, 用户

  • 问题内容: 我要尝试做的就是从服务器中搜索文件并显示图片。HTML有一个简单的搜索栏,您可以输入搜索词。JavaScript使用ajax请求来调用PHP文件,然后PHP在服务器上找到图像并将其发送回以显示。 现在发生的是该图像没有显示,并且我得到一个图标,指示一些无效的图像。Ajax调用似乎正在运行,但是我认为我发回的数据不正确。我一直在尝试搜索它,但是每个人似乎对如何执行它都有不同的看法,这有点

  • 问题内容: 我正在尝试使用HttpUrlConnection将图像发送到服务器,因为它是Google推荐的。我决定将图像转换为Base64字符串,然后将其发送到服务器,然后将其解码为.jpg文件。但是这种方法仅适用于小尺寸缩略图,而我无法发送全尺寸图像。 这是android客户端代码: Node.js服务器代码: 由于BufferedWriter的大小限制,我无法对完整尺寸的图像使用相同的方法-b

  • 我正在尝试使用gRPC和ProtoBuf将图像从Java客户端发送到Python服务器。我将图像编码为ByteString,并使用blockingStub发送它。Python服务器接收ProtoBuf,但Java ByteString现在是Python str。我不知道如何从str恢复图像。 当我调用服务器时: 它提出: 回溯(最近一次调用): 文件“/usr/local/lib/python2.

  • 问题内容: 我正在为我的应用程序使用烧瓶。我想将图像(由PIL动态生成)发送给客户端,而不保存在磁盘上。 任何想法如何做到这一点? 问题答案: 首先,你可以将映像保存到临时文件并删除本地文件(如果有): 其次,将临时文件设置为响应(根据此stackoverflow问题):