0

第一次在这里发帖。我知道内联 php 不是首选,但我还没有将所有脚本转换为 echo json_encoded 数组以在客户端的 javascript 中工作......所以现在,我有内联 php。

我不知道用户上传媒体的扩展名,因为它可能是 jpg、mp4 等,并且在上传时它会以用户 ID 作为标识符进入媒体文件夹。

当我的用户第一次加载 div(和 html 页面)时,php 脚本循环遍历一个数组并每次从 sql 查询到数据库执行 fetch_assoc;它返回 (media_id #) 并打印出一个 li,其中相应的媒体显示在查询中的其他一些值旁边。

我只知道 (media_id) 和不带扩展名的文件路径名。当页面首次加载时,一切正常,并且 file_exists 函数正确返回。

问题

当我 AJAX div 并再次执行查询时,因为用户在数据库中添加了一行,新列表会打印出所有信息,但是 file_exists 函数无法识别与以前完全相同的路径,我没有页面上的图像或视频。

我从原始 div 复制/粘贴完全相同的代码,并将其放在一个文件中供 ajax 重新查询和打印新的 li。

所有变量都是相同的,当我对测试文件路径进行硬编码时,它打印得很好。也许有一个缓存问题?

编码

<?php 

    $result=$conn->query($select);
    $row=$result->fetch_assoc();
?>

<li>

<?php
if ($row['count']>0) {
  echo "<div class='media-container'>";
       $pathname = "uploads/".$row["id"]."media1";
       $testjpg=$pathname.".jpg";
       $testjpeg=$pathname.".jpeg";
       $testpng=$pathname.".png";
       $testmp4=$pathname.".mp4";
     if (file_exists($testjpg)==TRUE || file_exists($testpng)==TRUE || file_exists($testjpeg)==TRUE) {
        echo '<img src="'.$pathname.'">';
     }if(file_exists($testmp4)==TRUE) {
        echo "<video></video>";
     }
  echo "</div>";
}?>

</li>

我可以就如何解决这个问题以及如何在未知媒体类型上打印适当的媒体标签提出一些建议。

输出

<div class='media-container'>
</div>

调试尝试

<img>在标签中回显已知图像的确切文件路径可以正常工作。放入echo'test';file_exists 案例什么都不做。

--

解决方案(种类)

所以我之前使用过 html 的 onerror 并且我找到了一种解决方法,尽管我仍然想知道为什么会出现错误。PSA 这使用JQuery,但javascript 也可以:

我的解决方案

<script>
function img2video(el, src) {
    $( el ).replaceWith( '<video class="videoClass"><source src="'+src+'" type="video/mp4"></video>' );
}
</script>

<body>
<img style="width:100%" onerror="img2video(this,'<?php echo$pathname;?>')" src="<?php echo$pathname;?>">
</body>
4

1 回答 1

0

好的,所以这是我使用 glob 最适合该问题的最终答案:

Javascript:

function img2video(el,src,place) {
      if (place=='type') {
        $( el ).replaceWith( '<video controls controlsList="nodownload" disablePictureInPicture style="width:100%;object-fit:contain;" preload="auto"><source src="'+src+'" type="video/mp4"></video>');
      }
    }

PHP:

<?php for ( $i=1; $i <= $limit; $i++) {
        $path ="[DIRECTORY]/".$row["id"]."media".$i;
        $path = (!empty(glob($path . '*.{jpg,png,jpeg,avi,mp4}', GLOB_BRACE)[0])) ? glob($path . '*.{jpg,png,jpeg,avi,mp4}', GLOB_BRACE)[0] : false;?>
     <div>
       <img onerror="img2video(this,'<?php echo$path;?>','type',<?php echo$row["id"];?>,<?php echo$i;?>)" src="<?php echo$path;?>">
     </div>
<?php } ?>

如果有人可以提供帮助,我不知道如何标记为重复。我的回答使用了来自 @Akif Hussain 对This Question的回复中的 Glob_Brace 。

于 2020-08-26T17:22:17.117 回答