【问题标题】:Display image after upload to a folder into PDF using PHP使用PHP将图像上传到文件夹后显示为PDF
【发布时间】:2020-12-05 12:58:21
【问题描述】:

我可以将图像上传到新文件夹,但主要是需要将其从该文件夹显示为 PDF。然后我正在使用 FDPF,但是显示时出现错误消息:

"Uncaught Exception: FPDF error: Can't open image file: Tulips.jpg "

但是当我回显 $img 时,它会显示。然后我在 pdf->Image($img) 中添加 $img 它不会工作它出现在消息错误上方。

这是我尝试编写的代码htmltopdf.html

var _validFileExtensions = [".jpg", ".jpeg", ".bmp", ".gif", ".png"];    
function ValidateSingleInput(oInput) {
    if (oInput.type == "file") {
        var sFileName = oInput.value;
         if (sFileName.length > 0) {
            var blnValid = false;
            for (var j = 0; j < _validFileExtensions.length; j++) {
                var sCurExtension = _validFileExtensions[j];
                if (sFileName.substr(sFileName.length - sCurExtension.length, sCurExtension.length).toLowerCase() == sCurExtension.toLowerCase()) {
                    blnValid = true;
                    break;
                }
            }
             
            if (!blnValid) {
                alert("Sorry, " + sFileName + " is invalid, allowed extensions are: " + _validFileExtensions.join(", "));
                oInput.value = "";
                return false;
            }
        }
    }
    return true;
}
function handleFileSelect(event) 
{
    console.log(event)
    var input = this;
    if (input.files)
    {
        var filesAmount = input.files.length;
        for (i = 0; i < filesAmount; i++)
        {
        var reader = new FileReader();
        console.log(reader)
        reader.onload = (function (e)
        {
            var span = document.createElement('span');
            span.innerHTML = ['<img class="thumb" src="',e.target.result, '" title="', escape(e.name), '"/><span class="remove_img_preview"></span>'].join('');
        document.getElementById('preview').insertBefore(span, null);
        });
        reader.readAsDataURL(input.files[i]);
        }
    }
}

$(document).ready(function(){     
    // Listen to click event on the submit button
    $('#submit').click(function (e) {
        e.preventDefault();
        var myform = document.getElementById("form");
        var fd = new FormData(myform);
        $.ajax({
            url:"upload1.php",
            type:"POST",
            data:fd,
            //dataType: 'json',
            processData: false,
            contentType: false,
            cache: false,       
            success:function(data){ 
                alert("Success Insert!");
            },
        });
        });     
$('#fileToUpload').change(handleFileSelect);    
//preview image and remove
$('#preview').on('click', '.remove_img_preview',function ()
{
    $(this).parent('span').remove();
    $("#fileToUpload").val("");
    });
});

</script>
<style>
div.relative {
  position: relative;
  top: -300px;
}
#bottom{
    position: relative;
    right:    0;
    bottom:   0;
}

.thumb
{
    width: 100px;
    height: 100px;
    margin: 0.2em -0.7em 0 0;
}
.remove_img_preview
{
    position:relative;
    top:-25px;
    right:5px;
    background:black;
    color:white;
    border-radius:50px;
    font-size:0.9em;
    padding: 0 0.3em 0;
    text-align:center;
    cursor:pointer;
}
.remove_img_preview:before
{
    content: "×";
}
table,th, td {
  border: 1px solid black;
  border-collapse: collapse;
}
th, td {
  padding: 5px;
  text-align: left;
}
textarea {
  width: 100%;
  height: 300px;
  padding: 12px 20px;
  box-sizing: border-box;
  border: 2px solid #ccc;
  border-radius: 4px;
  background-color: #f8f8f8;
  font-size: 16px;
  resize:none;
}

table.menu {
    border: 1px solid black;
    border-collapse: collapse;
    width: 10%;
    float:right;
}

</style>
<body>

<form action="generate_pdf.php" method="POST" id="form">
    <input type="submit" value="Send" id="submit" name="submit"><input type="reset" value="Clear">
    <input type="file" name="fileToUpload[]" id="fileToUpload" onchange="ValidateSingleInput(this);" multiple = "multiple" style="display: none;">
    <input type="button" value="Browse..." onclick="document.getElementById('fileToUpload').click();" />
    <input type="submit" value="PDF">
    <div id="preview"></div>
</form>

</body>
</html>

这里是upload1.php

<?php
require 'config.php';

$year = date("yy");
$year = substr($year, -2);
$month = date("m");
$key = "KM".$year.$month;
$total = count($_FILES['fileToUpload']['name']);
$sql = "SELECT * FROM images WHERE id LIKE '$key%' ORDER BY id DESC LIMIT 1";
$result = $conn->query($sql);

//GET NEW RUNNING NUMBER BY CHECKING DATABASE
if ($result->num_rows > 0) 
{
    // output data of each row
    while($row = $result->fetch_assoc())
    {
        $number = sprintf('%03d',substr($row['id'], -3)+ 1) ;
        $ans = $key.$number;
    }
} 
else
{
    $ans = $key."001";
}

$target_dir = "D:/XAMPP/htdocs/new3/new3/uploads/" . $ans;

if(!file_exists($target_dir))
{
    mkdir($target_dir,0777,true);
}
$sql = $conn->query ("INSERT INTO images (id) VALUES ('$ans')");

$allowed = array('gif', 'png', 'jpg','xlsx','pdf','doc');
$ext = pathinfo($total, PATHINFO_EXTENSION);
if (!in_array($ext, $allowed)) {
    echo 'error';
}

for( $i=0 ; $i < $total ; $i++ )
{
if (move_uploaded_file($_FILES["fileToUpload"]["tmp_name"][$i], $target_dir."/".$ans."-".$_FILES["fileToUpload"]["name"][$i]))
  {
    
    echo "The file ". basename( $_FILES["fileToUpload"]["name"][$i]). " has been uploaded."."<br>";
  } 
  else 
  {
    echo "Sorry, there was an error uploading your file.";
  }

}

?>

这是我尝试过的generate_pdf.php

    <?php
$img=$_FILES["fileToUpload"]["name"][0]; 
    
   echo $img;

require 'fpdf181/fpdf.php';
$pdf = new FPDF();
$pdf->AddPage();

$pdf->SetFont('Arial','B',10);
$pdf->Image($img,NULL,NULL,0,0,'PNG');
$pdf->Output();
?>

不知道我写的对不对?还是只需要回调图像存储的路径并显示出来?我自己已经在头脑风暴了,不知道它是如何工作的。任何人都可以帮忙吗?也许这是一个重复的问题,但我什至找不到任何相关的东西,只能找到如何从数据库中检索。

【问题讨论】:

    标签: php file-upload multipartform-data


    【解决方案1】:

    第一个问题是您的&lt;form&gt; 标签缺少enctype="multipart/form-data" 属性。

    至于 PHP 错误,$_FILES["fileToUpload"] 是一个数组,所以 $image=$_FILES["fileToUpload"]["name"] 应该更改为 $_FILES["fileToUpload"]["name"][0](假设您想要第一个文件)。所以generate_pdf.php应该以:

    开头
    $image=$_FILES["fileToUpload"]["name"][0]; 
    

    【讨论】:

    • 它显示“警告:fopen(download (1).png): failed to open stream”然后,“未捕获异常:FPDF 错误:无法打开图像文件:下载 (1).png "
    • 我的图片是调用download(1).png
    • 不应该$pdf-&gt;Image($image)$pdf-&gt;Image($img) 吗?另外,如果你想要上传的文件,你应该使用$_FILES["fileToUpload"]["tmp_name"][0]
    • 现在它说“致命错误:未捕获的异常:FPDF 错误:图像文件没有扩展名并且没有指定类型:C:/xampp/htdocs/test/uploads/ 在 C:\xampp\ htdocs\test\fpdf181\fpdf.php:271 堆栈跟踪:#0 C:\xampp\htdocs\test\fpdf181\fpdf.php(877): FPDF->Error('Image file has ...') #1 C:\xampp\htdocs\test\generate_pdf.php(11): FPDF->Image('C:/xampp/htdocs...') #2 {main} 在 C:\xampp\htdocs\test\fpdf181 中抛出\fpdf.php 第 271 行"
    • 听起来FPDF无法从PHP分配上传文件的临时文件名中确定类型。尝试添加这些附加参数:$pdf-&gt;Image($img, NULL, NULL, 0, 0, 'jpg')
    【解决方案2】:

    在我修改了一些之后,出现的错误是“致命错误:未捕获的异常:FPDF 错误:无法打开图像文件” 这是我修改调用 generate_pdf.php 的代码文件

    $image=$_FILES["fileToUpload"]["name"][0]; 
    $img="C:/xampp/htdocs/test/uploads/".$image;
    
    require 'fpdf181/fpdf.php';
    
    $pdf = new FPDF();
    $pdf->AddPage();
    
    $pdf->SetFont('Arial','B',10);
    $pdf->Image($img, NULL, NULL, 0, 0, 'png');
    $pdf->Output(); 
    

    【讨论】:

    • $_FILES["fileToUpload"]["tmp_name"][0]是文件的全限定文件名,所以需要将$img="C:/xampp/htdocs/test/uploads/".$image改为$img=$_FILES["fileToUpload"]["tmp_name"][0]。您根本不需要 $image 变量。
    • @kmoser 抱歉回复晚了,我只是修改了你告诉错误的内容“未捕获的异常:FPDF 错误:无法打开图像文件:Tulips.jpg”
    • 请编辑您的原始问题,以便显示您的最新代码。不要发布更新作为答案。
    • $img=$_FILES["fileToUpload"]["name"][0] 应该是$img=$_FILES["fileToUpload"]["tmp_name"][0]
    • @kmoser 非常感谢它的工作原理。因此,如果假设我需要将多个图像显示为 pdf,那么我需要数组变量的循环??
    猜你喜欢
    • 2021-09-29
    • 1970-01-01
    • 1970-01-01
    • 2018-05-28
    • 1970-01-01
    • 1970-01-01
    • 2015-08-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多