【问题标题】:Php external link to image file from internal server从内部服务器到图像文件的 PHP 外部链接
【发布时间】:2013-02-20 10:56:07
【问题描述】:

我被困住了,我希望这里有人可以帮助我。

我想在 php 脚本中创建一个文件的链接(该文件实际上是一个图像,一个 .tif 图像)。我无情地用谷歌搜索了这个,但无济于事。

防火墙阻止了外部连接,但我在模拟内部连接的机器上运行此查询。我目前使用这台机器允许外部用户运行访问内部数据库的查询,所以我知道这是可行的……

例如这部分工作得很好:

$result = pg_query($conn, $query); 
while($row=pg_fetch_assoc($result)) 
{ 
echo "<p>image details:<br />image: <u>" . $row['field'] . "</u>&nbsp;image date: <u>" . $row['field'] . "</u>&nbsp;image path: <u>" . $row['filename'] . "</u></p>";

我想变成链接的查询部分是$row['filename'],它返回为

//host\path\path\path\path\path\path\path.TIF 

...但现在我想访问与这些查询相关的某些文件。我想将此文件名转换为 url,当放入链接时,会转到此文件并打开它:

$imageURL = $row['filename'];
echo  "<p>Using imageURL: <a href='$imageURL' border='0' target='_blank'>Click Here</a></p>";

也许这是不可能的。 我似乎无法弄清楚如何获取图像。

我没有 imagemagick 或 imagick,我不想走那条路。提前感谢您的帮助。

编辑 我运行查询的机器是http://webapps.example.com
我正在查询的机器(图像所在的位置)不是 - 我试图返回的图像路径(作为链接)是 //hostipaddress\path\path\path\path\path\path\filename.TIF

【问题讨论】:

  • 显示一个实际示例,说明 $imageURL 当前包含的内容以及您希望它的外观。如果您的问题是关于通过网络重新格式化该路径与路由信息,我会感到困惑。
  • 返回为 //host\path\path\path\path\path\path\path.TIF。我不知道我想要它看起来像什么,这就是问题所在。我已将其重新格式化为 \\host\path\path\path\path\path\path\filename.TIF,当我将其复制并粘贴到内部浏览器中时,它可以正常工作。在此之前,我无法获得删除 www.domain.com/ 的链接。不知道是不是这个问题...
  • 图像主机是运行网络服务器还是网络共享?我问是因为“从内存”你不能使用 firefox 或 chrome 以这种方式链接到网络资源上的文件,但 Internet Explorer 应该使用文件链接,例如 file://///host/path/path/path/path /path/path/path.TIF
  • 图片所在的服务器是网络共享。承载此查询的机器是外部的。
  • 这听起来像是客户端(浏览器)安全问题,您使用的是哪个浏览器?

标签: php image postgresql hyperlink


【解决方案1】:

如果你有一个代理地址可以让你向外发送请求,你可以使用 curl 来完成。

** 更新 2

来自 curl 的图片 Save image from url with curl PHP

代理后面的卷曲:

curl_setopt($ch, CURLOPT_PROXY, "http://to.the.proxy.address"); 
curl_setopt($ch, CURLOPT_PROXYPORT, 8080); 
curl_setopt ($ch, CURLOPT_PROXYUSERPWD, "your password"); 

【讨论】:

  • 你应该对此发表评论或添加更多关于如何做到这一点
  • 我试过Curl、file_get_contents、fopen、readfile,都没有让我使用返回的$row['filename']作为链接的a href部分来打开图片。跨度>
  • 在您的 echo 语句中,您以 $row['filename'] 为例有何看法?
  • Echo 返回(完全格式化) //host\image\path\path\path\path\path\filename.TIF 我想这个方法可能有效,但是我绝对不想保存任何地方的图像,我想将它的路径放入一个链接中,单击该链接将在用户机器上打开图像。还有更多代码可以做到这一点吗?
  • @UnholyRanger 感谢您的评论。我是 stackoverflow.com 的新手,它可以帮助我更好地完成我的 cmets。干杯。 B.
【解决方案2】:

您可以使用可以正常链接到的代理页面来完成渲染图像的工作。

让我们调用代理页面 readimage.php,它将文件名或路径作为参数。

您的链接将如下所示:

<?php 
$imageURL = $row['filename'];
echo  "<p>Using imageURL: <a href='readimage.php?image=$imageURL' border='0' target='_blank'>Click Here</a></p>";
?>

readimage.php

<?php

$img = isset( $_GET['image'] ) ? $_GET['image'] : null;

if ( !$img )
    return;

// Build internal file path
//$filepath = dirname( __FILE__ ) . DIRECTORY_SEPARATOR . 'myimages' . DIRECTORY_SEPARATOR . $img;
$filepath = $img;

//==========================
// VERY IMPORTANT TO WHITELIST THE PATH OR RESULT to make sure you're not showing unintended data
//==========================

if ( file_exists( $filepath ) ) {
    // Find mime type 

    $mime = '';

    // Try using the fileinfo functions. Requires PHP >= 5.3 and PECL 1.0
    if ( function_exists( 'finfo' ) ) {
        $finfo = new finfo( FILEINFO_MIME ); // return mime type ala mimetype extension

        /* get mime-type for a specific file */
        $mime = $finfo->file( $filepath );
    } 

    // No mime yet? Try to use the deprecated mime_content_type() function 
    if ( !$mime && function_exists( 'mime_content_type' ) ) {
        $mime = mime_content_type( $filepath );
    }

    // Not yet? Fallback to extensions :(
    if ( !$mime ) {
        $ext = pathinfo( $filepath, PATHINFO_EXTENSION );

        switch ( $ext ) {
            case "jpg" :
            case "jpeg" :
            case "jpe" :
                $mime = "image/jpg";
            break;
            case "png" :
            case "gif" :
            case "bmp" :
            case "tiff" :
                $mime = "image/" . strtolower( $ext );
            break;
        }
    }

    if ( $mime ) {
        header( 'Content-type: ' . $mime );

        readfile( $filepath );
    }
}

?>

【讨论】:

  • 这看起来很有希望,我将在哪里使用我的 $row['filename']?
  • +1 用于意识到问题是网络共享而不是与 http 服务器相关。对我来说似乎是一个很好的工作。
  • @milwaukee66 我用我的概念解决方案修改了您的链接示例。它在答案中
  • kjetilh,我稍后或明天会检查一下,看起来很有希望,谢谢!
  • 这里要考虑的一点是运行 php 进程的用户帐户,确保它有权访问共享。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-09-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-07
  • 2013-03-24
相关资源
最近更新 更多