IOError: Errno 13 Отказано в доступе для определенных файлов

Я использую фляжный API, который можно использовать для загрузки файлов jpg. Около года работает нормально, но сегодня ни с того ни с сего загружаемые файлы отклоняются для конкретного пользователя API. На самом деле нет никакой разницы в обработке запроса от одного пользователя к другому, но один и тот же файл отклоняется для пользователя А и принимается для пользователя Б, а у пользователя А никогда раньше не было этой проблемы. Это сводит меня с ума !

Вот код в 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))
                (...)

Все работает нормально до файла.сохранения, где я получаю следующую ошибку, когда пользователь А пытается загрузить файл:

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, для пользователя unix, созданного специально для запуска API:

$ 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.


person Kyrill    schedule 25.11.2015    source источник


Ответы (1)


Я еще немного покопался, и оказалось, что я пытался перезаписать некоторые файлы, которые ранее были добавлены пользователем root (у пользователя myApi не было прав на перезапись).

Первым делом я проверил, были ли проблемные файлы уже на сервере, но я сделал это, выполнив поиск файлов с помощью Finder и Transmit (на Mac), что, по-видимому, было не так эффективно, как использование команды «ls». в папке, содержащей сотни файлов.

Используя «ls -l», я увидел, что проблемные файлы принадлежат пользователю root, а не пользователю myApi (мне действительно пришлось переместить эти файлы с одного сервера на этот некоторое время назад, что объясняет, почему пользователь myApi не владелец).

Теперь я попытаюсь найти команду UNIX для изменения разрешений каждого файла, добавленного пользователем root в эту папку, или изменить разрешения пользователя myApi, чтобы он мог перезаписать любой файл в этой папке...

Изменить: я изменил разрешения, используя

$sudo chown -R myApi:myApi files/images
person Kyrill    schedule 26.11.2015