从上传创建新文件

时间:2013-11-06 08:47:22

标签: python linux django permissions subprocess

我遇到了一个小问题:

我有一个网站来管理不同用户的视频文件。每个用户都可以将视频上传到我不想更改的个人文件夹,因为我不想混淆不同用户的文件。上传视频文件后,我调用了一个subprocess,它应该创建一个缩略图。由于ffmpeg中的错误,子进程失败,似乎与缺少写入权限有关。上传的文件和包含的文件夹属于www-data。

代码:

command = ("ffmpeg -ss 00:00:10 -i %s -dframes 1 %s -y" % (video_path, image_path)).split()
subprocess.call(command)

FFMPEG似乎作为不同的用户运行,因为它仅在目标文件夹具有777权限时才有效。否则它会失败并显示以下消息:

av_interleaved_write_frame(): I/O error occurred
Usually that means that input file is truncated and/or corrupted.

如果我touch图像文件而不是通过ffmpeg创建它,那么文件夹是否有775或777并不重要。结果文件也属于www-data,这意味着子进程本身是作为www-data运行的,不是吗?

我考虑创建一个具有777权限的子文件夹,但我不喜欢它有两个原因:必须动态创建此文件夹,因为我希望能够创建新用户(并在我的上传中生成新的子文件夹) -夹)。无论如何,777权限都不是一个好方法。

您是否有任何建议需要更改,以便ffmpeg可以在不打开安全漏洞的情况下写入文件夹而无需在创建新用户/文件夹时触摸任何内容?

3 个答案:

答案 0 :(得分:2)

尝试按照here

所述指定-vframes 1

但是,对于ffmpeg 0.9 and laterdframesvframes都是frames的别名,因此如果您使用较新版本的ffmpeg,问题就会出现在其他地方。

答案 1 :(得分:2)

我找到了它!

这不是权限问题,而是错误处理中的一些奇怪的问题:如果代码是从Web服务器运行的,则在发生错误时会解除生成的图像文件。如果从命令行运行,则生成的文件仍保留在文件夹中。

所以基本上我改变了命令,使用-vframes而不是-dframes(在Windows中只能正常工作)不再出现​​任何错误消息:

command = ("ffmpeg -ss 00:00:10 -i %s -vframes 1 %s -y" % (video_path, image_path)).split()

答案 2 :(得分:1)

您可以与Celery异步运行转化过程。您的工作进程可能会被调用所需的权限,而apache只需要访问通信通道的权限,例如RabbitMQ