【问题标题】:Using input[type="file"] to prompt the user to save the file使用 input[type="file"] 提示用户保存文件
【发布时间】:2016-03-24 23:46:35
【问题描述】:

我正在尝试通过input file 标记实现两个操作。我有以下输入:

<input id='file-input' name='attach' type='file' style='margin-left:15px;'/> 

这可以在messages.php 中找到。我想要实现的是两件事:

  1. 如果上传的文件大小超过 1mb(或者不是图像的文件),则生成一个按钮,单击该按钮会打开 save as 菜单,用户可以从中选择他们希望下载的位置数据。
  2. 其次,如前所述,如果文件大小低于 1mb,则只需在页面上显示数据(仅适用于图像文件)。

我有其他页面使用input type="file" 上传个人资料图片,并且刚刚在页面上显示了图片。但我不确定如何执行 (1) - 如何打开用户可以保存数据的菜单?

【问题讨论】:

  • 我已经为您提供了一个解决方案,但需要添加一个细节来完成它。当用户上传时,我猜他上传到服务器,现在为什么你应该在上传时保存为文件,你不应该给出用户应该在服务器上保存文件的选项?还是我误会了你?
  • 或者我也可以理解如果文件低于1Mb所以用户只能查看文件,如果文件超过1Mb则用户可以将文件上传到服务器?对吗?
  • @maytham-ɯɐɥʇʎɐɯ - 不抱歉,我应该更清楚。因此,假设我向您发送附件,例如,我将选择一张图片,然后单击发送,这会将图片作为按钮发送给您(即,如果我向您发送附件,这就是您将看到的 images.phpgang.com/2012/08/download.jpg )。然后,当单击按钮时,图像可以保存在您个人计算机上的任何位置。我不想在服务器上存储任何东西。
  • 好的,如果文件小于 1 MB 查看它,否则下载它并将其保存在本地磁盘上的某个位置
  • 嗯,我一直在想,不管它的大小,我总是想提示用户将它保存在本地磁盘上。我相信它是一个更简单的解决方案?

标签: php html


【解决方案1】:

只需提供带有Content-Disposition: attachment 标头的文件,请参阅PHP Outputting File Attachments with Headers

【讨论】:

  • 别忘了content-length 标头,下载文件真的很烦人,不知道它会有多大。
【解决方案2】:

在其他不错的答案中,我会这样做。

我已经通过点击您建议的下载按钮实现了这一点,如果文件大于 1Mb,您将获得像这样的下载弹出窗口

否则,如果文件小于 1Mb,它只会在浏览器上显示,如下所示:

顺便说一句,代码是自我解释的。

名为 index.php 的 PHP 部分

<?php
$filename = "test3.jpg";
$maxSize = 1000000; // 1Mb

if (isset($_POST['save']))
    fileHandler($filename, $maxSize);

function fileHandler($filename, $maxSize)
{
    $fileinfo = getimagesize($filename);
    $filesize = filesize($filename);
    $fp = fopen($filename, "rb");
    if ($fileinfo && $fp)
    {
        header("Content-Type: {$fileinfo['mime']}");
        if ($filesize > $maxSize)
        {
            header('Content-Disposition: attachment; filename="NewName.jpg"');
        }
        fpassthru($fp);
        exit;
    } else
    {
        echo "Error! please contact administrator";
    }
}

?>

index.php 中的 HTML 部分,但重要的是这段代码应该在 php 标记之后而不是之前。

<form action="index.php" method="post">
    <button type="submit" style="border: 0; background: transparent" name="save">
        <img src="download.jpg" alt="submit" />
    </button>
</form>

注意:您的 php 文档直接以&lt;?php ... 开头很重要,请read

【讨论】:

  • 抱歉,我还没有查看您的答案。我目前正在努力解决与附件文件相关的问题(请参阅:stackoverflow.com/questions/36389726/…),在我实施您的解决方案之前需要解决这个问题。希望我会尽快修复,并可以测试您的解决方案:)
  • 我已经解决了你的问题,让我知道,你的另一个问题更能理解这个问题,所以如果这里的答案需要更新,请随时填写让我知道
  • 你好梅瑟姆!我有一个好消息,所以昨天之后,我想出了如何获取图像的大小,现在它下载了图像!但是..打开时图像不显示。你能加入这个聊天室吗:chat.stackoverflow.com/rooms/108446/attachment-images - 只剩下最后一道障碍了!
【解决方案3】:

您无需伪造点击或其他内容。你可能需要这样的东西。

  1. 用户选择文件并点击“上传文件”按钮。
  2. 文件上传使用例如PHP。
  3. PHP 使用正确的标题显示文件的内容。
  4. PHP 确定文件是小于还是大于 1MB。
    1. 如果文件较大,请设置header,强制用户下载文件(导致选择位置弹出窗口)。
    2. 如果文件较小,不设置header,导致文件显示在浏览器中。

斜体是用户操作,粗体是服务器操作。

【讨论】:

    【解决方案4】:

    您可以通过获取图像 mime 类型并设置内容处置和内容类型标题来做到这一点:

    $file = 'path/to/file';
    
        if (file_exists($file)) {
    
                $contents = file_get_contents($file);
                $fileSize = filesize($file);
                $image_info = getImageSize($file);
                $mimeType = $image_info['mime'];
                header("content-disposition: attachment; filename=" . basename($file));
                header("content-type:$mimeType");
                header("Content-length: $fileSize");
                echo $contents;
                exit;
        }
    

    【讨论】:

      猜你喜欢
      • 2011-09-06
      • 2015-06-28
      • 2010-11-27
      • 1970-01-01
      • 2015-11-09
      • 2011-05-18
      • 1970-01-01
      相关资源
      最近更新 更多