我有一个Django Web应用程序,允许用户上传他们的显示图片。有些用户可以看到此显示图片,但并非所有人(并非所有用户)都可以访问此图片。话虽如此,在开发中,我曾经在我的机器上本地保存它。在我的设置文件中,我有
MEDIA_ROOT = '/home/myProfile/Documents/thisFolder/uPhotosFolder'
MEDIA_URL = '/media/'
并且Django会将所有用户上传的显示图片保存到我的机器上的media rood(uPhotosFolder)。
话虽如此,我部署(或者至少是尝试部署)应用程序,当我将MEDIA_ROOT和MEDIA_URL保留在我的设置文件中时
MEDIA_ROOT = '/home/myProfile/Documents/thisFolder/uPhotosFolder'
MEDIA_URL = '/media/'
并尝试上传图片,表示访问被拒绝。显然我必须进入我的EC2实例(我使用Amazon Web Services)并创建
'/home/myProfile/Documents/thisFolder/uPhotosFolder'
目录然后开始保存显示图像。
我的问题是,这是在服务器上保存私人用户上传图像的正确/最佳方式吗?或者我也应该使用S3吗? (根据我的描述,S3上的图像存储在云端,任何人都可以通过URL访问)有没有办法立即将S3用于我的情况?
答案 0 :(得分:0)
将图像存储在文件夹或S3存储中的EC2实例上的问题与文件隐私无关。
MEDIA_ROOT定义媒体文件夹的位置。 MEDIA_URL定义了在提供媒体时形成的URL。
现在存储如果我们使用默认文件系统存储,我们最终将文件保存在MEDIA_ROOT中。我们可以通过设置文件中的一些其他配置将存储更改为S3。 (Docs Here)
现在可以通过限制对URL的访问来保护用户的文件。对于此媒体,可以使用在使用nginx提供文件时使用的X-Accell-Redirect标头来保护URL(例如:Here)。 如果您继续使用S3存储来提供媒体文件(在生产环境中更为可取) - S3存储提供了获取媒体受保护URL的功能,可以将其传递给客户端以检索媒体。这些网址在有限的时间内具有可访问性。