【问题标题】:php manipulating uploaded images/files from the tmp folder before moving to another folderphp 在移动到另一个文件夹之前从 tmp 文件夹操作上传的图像/文件
【发布时间】:2010-09-04 11:32:13
【问题描述】:

在以通常的方式上传图像文件后,我一直在处理图像文件,例如将文件从 /tmp 文件夹移动到网站的首选文件夹。

现在我想通过将图像保存在临时文件夹中来操作图像,一旦完成,我想将其移动到首选文件夹。

我想做的是……

  1. 显示一个非常简单的自定义文件上传对话框。
  2. 选择一张图片并点击上传。
  3. 表单已提交到 iframe,因此我可以显示进度条。
  4. php 脚本将回显 javascript 代码,该代码将从 iframe 调用父窗口函数以通知图像已上传。
  5. 我想显示另一个对话框,它将显示 tmp 文件夹中的图像,以便用户可以调整大小和裁剪。
  6. 当用户选择图像上的一个区域进行裁剪时,我会将坐标发送到服务器并处理 tmp 文件夹中的图像。
  7. 图像处理完成后,我希望将最终图像移动到我的目标文件夹。

这是我的疑问。

  1. 临时图像将在 tmp 文件夹中保留多长时间。
  2. 如何在对话框的 temp 文件夹中显示图像,因为我只有它的物理路径。
  3. 我想我可以像<img src='fetchfromtmp.php?filename> 那样做。不是吗?
  4. 在 php 脚本中,我可以像 readfile('tmp/tmpfile') 一样读取图像。

    那么,最后,从临时文件夹进行操作会好吗?它会有效/有启发性吗?可能有什么并发症?如果有的话。

    我想对我的想法提出建议和替代方案。 谢谢。

【问题讨论】:

    标签: php image-manipulation


    【解决方案1】:

    我认为您不应该像这样使用临时文件夹,不幸的是,您必须创建自己的(或使用数据库来存储图像)。原因是您的第 1 点和第 2 点:

    1. 只有在上传它的脚本完成运行之前,才能保证图像保留在临时文件夹中。这意味着无论您的表单提交给什么脚本,都应该将其移动到安全的地方
    2. 通常,此临时文件夹位于用户看不到的位置。您可以按照您的建议破解一些东西,但是您必须非常确定自己在做什么,以避免造成任何安全漏洞。

    【讨论】:

    • 关于删除 tmp 中的文件:@TimFountain 所说的在实践中可能是正确的(我从未检查过),但这不是理论上应该发生的事情。来自 PHP 手册:“如果文件没有被移走或重命名,它将在请求结束时从临时目录中删除。”
    • 是的。我正在试验它。所以我稍后会评论你。
    • 为什么 tim 提到文件不会被删除。当我在 localhost 中进行实验时,我可以看到脚本终止后文件被删除。可能是他在谈论自定义文件夹,当在ini中设置为默认上传文件夹时,该文件不会被删除,因为它在用户范围内。可以使用 cron 删除文件。我说的对吗?
    • 如果您有自己的临时文件夹,您可以使用 cronjob 删除所有超过一小时左右的文件。
    【解决方案2】:

    简短的回答是,这不是一个好主意。 tmp 文件夹中的文件可以在没有您干预的情况下删除,因此请将它们移动到您自己的应用程序内的临时文件夹中,在那里进行处理,完成后将其移动到最终位置。

    【讨论】:

    • 是的。正如我所解释的,这将是默认操作。但我想知道幕后。这个我想了很久,今天我问了。谢谢。
    • 这里真的没有幕后的东西。问题很简单,很有可能做你计划做的事情,但是唯一也是最大的问题是,如果 tmp 文件夹在你通过操作系统或计划作业或类似的东西处理文件时被清除了怎么办? ?冒这个风险是没有意义的。
    • 是的。我同意。谢谢你的拳头。只有在提出这个问题之后,我才让自己更加意识到这个问题,我说这就是我提出这个问题的原因。所以我会考虑这个。
    【解决方案3】:
    • 图像将在 tmp 文件夹中,直到被删除。您的主机可能会定期清除它,但可能不会,因此除非您将其删除,否则它将保留在那里。
    • 要显示 tmp 文件夹中的图像,您必须使用脚本将其读入并提供(或使用 X-Sendfile)。
    • PHP 可以毫无问题地从 tmp 目录读取

    但是,您只需在上传后将图像移动到应用程序中的 tmp 目录即可解决所有这些问题。这样您就知道它不会被删除,您可以轻松地将其提供给用户,并且您知道您将能够读取该文件。

    或者,如果您可以访问您的 php.ini 文件,您可以更改 upload_tmp_dir 并首先将图像上传到应用程序中的 tmp 目录。

    【讨论】:

    • 您不应依赖未记录的功能。只需移动该死的文件,否则您的程序将在不同的设置下运行不连贯。
    • 我正在尝试回复。所以,我稍后会评论你。
    • 我也会关注这个。现在我将移动文件。首先,我对您开始的方式感到困惑,临时文件将不会被删除。然后当你说在ini文件中设置一个tmp文件夹时我得到了你的答案,这样上传的文件将成为用户控制的文件夹,这样我们就可以使用cron删除旧文件。我希望你是这样提到的。谢谢你。除此之外,我做了一点实验,这让我清楚地知道,当脚本终止时,上传的文件将被删除。我检查了本地主机。谢谢。
    • 您能否确认您说的是在 ini 文件中设置的自定义 tmp 文件夹,而不是默认的 /tmp 文件夹。这样我就可以确定所有这些答案。
    • 我不知道 tmp 文件在脚本结束后被删除,这不是我的经验。但重点仍然存在 - 只需将上传的文件移动到应用程序中的目录,然后从那里进行操作。
    【解决方案4】:

    docs 对此非常清楚

    如果该文件没有被移走或重命名,则该文件将在请求结束时从临时目录中删除。

    所以你的想法行不通。另一方面,在大多数操作系统中,重命名文件是一项非常便宜的操作,因此没有充分的理由不立即移动临时文件。

    【讨论】:

    • 是的。我正在试验它。所以我稍后会评论你。
    • 我喜欢您在“重命名文件不会占用太多资源”这一行中的回答……是的,我同意。此外......我问这样一个问题的原因是我不想在数据库中维护文件名,直到它被用户裁剪。无论如何,所有的答案都是有用的。
    【解决方案5】:
    I think i can do it like <img src='fetchfromtmp.php?filename>. isn't it?
    

    这会给您的服务器带来漏洞。不要忘记临时文件夹默认也包含会话文件。

    【讨论】:

    • 这是我为管理员用户做的。无论如何,你说的不遵循这个会更有益......是的,我同意。
    猜你喜欢
    • 1970-01-01
    • 2020-07-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-10-25
    • 2014-09-17
    • 1970-01-01
    相关资源
    最近更新 更多