簡體   English   中英

IOError:Errno 13特定文件的權限被拒絕

[英]IOError: Errno 13 Permission denied for specific files

我正在運行一個Flask API,該API可用於上傳jpg文件。 它已經運行了大約一年,但是今天,突然之間,該API的特定用戶拒絕了上載的文件。 實際上,從一個用戶到另一個用戶的請求處理沒有任何區別,但是同一文件被用戶A拒絕並被用戶B接受,並且用戶A以前從未遇到過此問題。 這讓我瘋狂 !

這是flask API中的代碼:

from werkzeug.utils import secure_filename

ALLOWED_EXTENSIONS = set(['txt', 'pdf', 'png', 'jpg', 'jpeg', 'gif'])

def allowed_file(filename):
    return '.' in filename and filename.rsplit('.', 1)[1] in ALLOWED_EXTENSIONS


@app.route('/uploadFile/', methods=['POST'])
@auth.login_required
def newImage():
    if request.method == 'POST':
        if request.files:
            file = request.files['file']
            if allowed_file(file.filename):
                ImageId = request.args.get('ImageId')
                newImage = DB_Image()
                newImage.ObjectId = ImageId

                filename = secure_filename(file.filename)
                pictureName, fileExtension = os.path.splitext(filename)
                fullFileNameToBeSaved = str(newImage.ObjectId) + fileExtension
                imagesPath = os.path.join(app.static_folder, 'images')

                file.save(os.path.join(imagesPath, fullFileNameToBeSaved))
                (...)

一切正常,直到file.save為止,當用戶A嘗試上傳文件時,出現以下錯誤:

mod_wsgi (pid=14170): Exception occurred processing WSGI script '/var/www/myApi/wsgi/myapivenv.wsgi'.
Traceback (most recent call last):
   File "/usr/local/lib/python2.7/dist-packages/flask/app.py", line 1836, in __call__
     return self.wsgi_app(environ, start_response)
   File "/usr/local/lib/python2.7/dist-packages/flask/app.py", line 1820, in wsgi_app
     response = self.make_response(self.handle_exception(e))
   File "/usr/local/lib/python2.7/dist-packages/flask/app.py", line 1403, in handle_exception
     reraise(exc_type, exc_value, tb)
   File "/usr/local/lib/python2.7/dist-packages/flask/app.py", line 1817, in wsgi_app
     response = self.full_dispatch_request()
   File "/usr/local/lib/python2.7/dist-packages/flask/app.py", line 1477, in full_dispatch_request
     rv = self.handle_user_exception(e)
   File "/usr/local/lib/python2.7/dist-packages/flask/app.py", line 1381, in handle_user_exception
     reraise(exc_type, exc_value, tb)
   File "/usr/local/lib/python2.7/dist-packages/flask/app.py", line 1475, in full_dispatch_request
     rv = self.dispatch_request()
   File "/usr/local/lib/python2.7/dist-packages/flask/app.py", line 1461, in dispatch_request
     return self.view_functions[rule.endpoint](**req.view_args)
   File "/usr/local/lib/python2.7/dist-packages/flask_httpauth.py", line 61, in decorated
     return f(*args, **kwargs)
   File "/var/www/myApi/code/ImageUpload.py", line 227, in newImage
     file.save(os.path.join(imagesPath, fullFileNameToBeSaved))
   File "/usr/local/lib/python2.7/dist-packages/werkzeug/datastructures.py", line 2576, in save
     dst = open(dst, 'wb')
 IOError: [Errno 13] Permission denied: '/var/www/path_to_upload_folder/files/images/2a6d85db-7ef0-40e3-8031-b7ed490bc512.jpg'

權限是在我安裝API時為專門為運行API創建的unix用戶設置的:

$ sudo usermod -a -G myApi $USER
$ sudo chown -R $USER:myApi var/www/path_to_upload_folder/ path_to_upload_folder/files/images
$ sudo chmod -R g+w var/www/path_to_upload_folder/ path_to_upload_folder/files/images

但是API的用戶是在數據庫中管理的,它們與UNIX用戶無關,因此我高度懷疑問題出在哪里。

在特定用戶發送的某些特定文件上,可能會導致像這樣的錯誤嗎?

我正在使用Werkzeug 0.9.4和燒瓶0.10.1。

我做了一些進一步的挖掘,結果發現我試圖覆蓋一些以前由root用戶添加的文件(myApi用戶沒有覆蓋它們的權限)。

我首先要做的是檢查問題文件是否已經在服務器上,但是我通過使用Finder和Transmit(在Mac上)搜索文件來完成的,這顯然不如使用“ ls”命令有效,在包含數百個文件的文件夾中。

使用“ ls -l”,我看到有問題的文件是由根用戶而不是myApi用戶擁有的(實際上,我一段時間前不得不將這些文件從一台服務器移到該服務器,這解釋了為什么myApi用戶不屬於該用戶)主人)。

現在,我將嘗試查找UNIX命令來更改root用戶在該文件夾中添加的每個文件的權限,或者更改myApi用戶的權限,以便它可以覆蓋該文件夾中的任何文件...

編輯:我更改了使用的權限

$sudo chown -R myApi:myApi files/images

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM