最佳实践:为非现有任务上传图片

时间:2016-03-17 09:40:59

标签: php mysql database

我正在编写CRM(客户关系管理),员工可以在其中添加任务并将其分配给其他员工(在PHP中)。

还要求员工能够上传任务的图像(例如,当遇到错误时,他们会制作打印屏幕并将其添加到任务中)

现在我的问题是,你如何在图像和数据库中的任务之间建立关联?在员工进入GUI中的“创建任务表单”时,数据库中将没有“任务”条目,因此我无法将上载的图片分配给“task_id”。因此,我的逻辑目前要求在您上传图片之前,在数据库中创建“任务”条目。为什么? =>因为当你有一个表“task”的条目时,你有“task_id”,这是在“task_image”(对于外键)中输入所必需的。

我已经考虑过通过GUID创建task_id而不是使用自动增量功能的选项,但由于其他要求,这是不可能的。

3 个答案:

答案 0 :(得分:0)

如果在将图片的详细信息存储在图片表中之前,确实无法将任务输入到任务表中,您可以简单地为taskID使用任意值并使用隐藏字段将其传递给表单,直到您将任务存储在表中,然后只需运行更新查询,将taskID更改为正确的值而不是最后的任意值。

类似的东西:

$promise:d
  $$state:Object
  __proto__: Object
$resolved:true
objDetails:Array[3]
showImage:false
title:"Tetsing Typescropit"
__proto__: Object

答案 1 :(得分:0)

如果不知道您的代码是如何构建的,我很难提供具体的建议,但我知道您希望在提交任务表单之前通过单独的渠道(例如某些JavaScript代码)接受文件上传,就像Gmail一样。

您可以将文件存储在Web根目录外的临时目录中,其中包含一个难以猜测的长随机名称:

/home/foo/site/files/pending/5baa61e4c9b93f3f0682250b6cf8331b7ee68fd8
<input type="hidden" name="file" value="5baa61e4c9b93f3f0682250b6cf8331b7ee68fd8">

...并将此名称添加到隐藏的表单字段中。之后,当您创建任务并拥有任务ID时,您可以读取相应的文件并将其移动到其最终位置。要考虑到:

  • 永远不要将原始原始ID作为路径处理,例如:

    file_get_contents($_POST['file']);
    
  • 设计一个过程,使未使用的文件在给定时间后过期(即删除)

如果您特别担心安全性,可以将文件与不同用户分开,无论是具有每用户目录还是为文件名添加前缀:

/home/foo/site/files/pending/1234-5baa61e4c9b93f3f0682250b6cf8331b7ee68fd8
<input type="hidden" name="file" value="5baa61e4c9b93f3f0682250b6cf8331b7ee68fd8">
if (preg_match('/^[a-f0-9]+$/', $_POST['file'])) {
    $file = sprintf('/home/foo/site/files/pending/%d-%s', $_SESSION['user_id'], $_POST['file']);
}

答案 2 :(得分:0)

有几个选择。 &#34;最佳实践&#34;是一个非常主观的术语,这完全取决于这里的背景。

第一个选项是你创建&#34;任务&#34;在用户上传图像时输入,并将其作为参数传递给您的主要任务&#34;上传完成时形成。例如,您可以将其存储在当前会话中;然后当你完成&#34;任务&#34;输入,你检查会话,看看是否有&#34; taskID&#34;设置并更新该任务ID,而不是创建一个。

<pseudo_code>
taskID = imageUpload (image)
session.store("taskID", taskID)
....
taskbutton.submitButton
  if (session.taskID)
    updateTask(taskID, formFields.name, formfields.description, ...)
  else
    createTask(formFields.name, formfields.description,....)
  end if
end

</pseudo_code>

这需要您的表单中的一些JavaScript,但是很简单;缺点是您可能最终在数据库中完成了不完整的任务(例如,如果用户放弃了表单)。

另一种方法是上传图片,但不要填写外键,直到您知道taskID。这比看起来更难 - 您必须在会话中携带所有imageID,因此您可以在创建任务时更新它们。如果会话超时,或者用户放弃表单,则最终会出现孤立图像。