我正在尝试将JPEG图像从应用程序转移到另一个应用程序。在我收到它的地方,流来自请求的正文,我尝试再次整理文件,如下所示:
if r.status_code == 200:
f = open(os.path.join(os.path.dirname(os.path.realpath(__file__)) + "\\static\\tmp\\" + filename), 'wb')
f.write(r.content)
f.close()
return True
在localhost中运行时效果很好。该文件就在它的位置,就像我上传它时一样。
当我去部署所有应用程序并对其进行测试时,Apache不允许我执行f = open(...)
,这给了我错误:
IOError: [Errno 13] Permission denied: u'/var/www/my_url\\static\\tmp\\2378687.jpeg'
这很奇怪,因为 tmp 文件夹具有属性
unconfined_u:object_r:httpd_sys_rw_content_t:s0
它不应该允许我创建新文件,即使不是sudo用户吗?
答案 0 :(得分:2)
使用os.path.join代替enter code here
。这使您的代码在linux / windows os之间更加便携。
\\
您不是指/ tmp,而是尝试在静态文件夹中写入:f = open(os.path.join(os.path.dirname(os.path.realpath(__file__), "static,"tmp" , filename), 'wb')
。尝试使用绝对路径。
答案 1 :(得分:1)
你的函数的第一行有一个错误。它应该是
f = open(os.path.join(os.path.dirname(os.path.realpath(__file__),
"static", "tmp", filename), 'wb')
Windows和Linux上的目录分隔符不同。这就是为什么它在本地工作,但不在服务器上。 os
模块用于抽象出这些差异,但实际上并没有使用它来构造文件名。编写代码的方式,os.path.join()
是一个noop。
您的代码尝试将名为my_url\static\tmp\2378687.jpeg
的文件写入目录/var/www/my_url
。
此外,您应该使用context manager,可能是文件路径的可配置常量,捕获错误也是个好主意:
UPLOAD_DIR = '/var/www/my_url/static/tmp'
if r.status_code == 200:
try:
with open(os.path.join(UPLOAD_DIR, filename), 'wb') as f
f.write(r.content)
except IOError as e:
# log e.message or something
return False
return True