我正在尝试使用Falcon框架(python)实现POST请求以上传文件。

我已经使用falcon-multipart来进行multipart/form-data的操作,这使我可以在cgi.FieldStorage()中以二进制格式检索文件,但是现在,我需要将该文件写入目录为原始扩展名。

这是我正在使用的代码。

app.py:

import falcon

from .files import Resource

from falcon_multipart.middleware import MultipartMiddleware

api = application = falcon.API(middleware=[MultipartMiddleware()])

files = Resource()
api.add_route('/files', files)

files.py:
import io
import os
import shutil

import falcon
import json


class Resource(object):

   _storage_path = './uploaded_files'

   def on_post(self, req, resp):
        """
        POST METHOD
        """
        # Retrieve file extension
        ext = req.get_param('extension')

        # Retrieve input_file
        input_file = req.get_param('file')

        # Read file as binary
        raw = input_file.file.read()

        # Retrieve filename
        filename = input_file.filename

        # Define file_path
        file_path = os.path.join(self._storage_path, filename)

        # Write to a temporary file to prevent incomplete files from
        # being used.
        temp_file_path = file_path + '~'

        # Finally write the data to a temporary file
        with open(temp_file_path, 'wb') as output_file:
            shutil.copyfileobj(raw, output_file)

        # Now that we know the file has been fully saved to disk
        # move it into place.
        os.rename(temp_file_path, file_path)

        resp.status = falcon.HTTP_201

最佳答案

我必须学习 cgi

  • cgi - File upload
  • cgi - Big file upload

  • 这是我使用的实现:
    def on_post(self, req, resp):
            """
            POST METHOD
            """
            # Retrieve input_file
            input_file = req.get_param('file')
    
            # Test if the file was uploaded
            if input_file.filename:
                # Retrieve filename
                filename = input_file.filename
    
                # Define file_path
                file_path = os.path.join(self._storage_path, filename)
    
                # Write to a temporary file to prevent incomplete files
                # from being used.
                temp_file_path = file_path + '~'
    
                open(temp_file_path, 'wb').write(input_file.file.read())
    
                # Now that we know the file has been fully saved to disk
                # move it into place.
                os.rename(temp_file_path, file_path)
    
        resp.status = falcon.HTTP_201
    

    关于python-3.x - Falcon和falcon-multipart + POST请求,用于上传文件,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/48940530/

    10-11 15:58