python 2.7 简单文件上传

python 2.7 simple file upload

开发环境

wsgi,ckan,python2.7,jquery1.4使用

开发pythoncgi简单文件上传时出错。 Ajax 上传请求 Chrome 调试显示文件正常。 它也包含在服务器日志环境中的 wsgi.input 中。 取出该数据并将其放入临时文件 是不是创建FieldStorage没有正确创建? FieldStorage中的所有值都为空

HTML

<input type="file" name="add_code_linkfileup" style="display: none;">

脚本

    input_file.onchange = function(){
       pop_file_upload("INPUT[name ="+event.target.name+"]");
    };
    
    function pop_file_upload(target){
        var form_data = new FormData();
        form_data.id = "form";
        form_data.enctype = 'multipart/form-data';
        form_data.append('file', $(target).prop('files')[0]);
        $.ajax({
            type: 'POST',
            url:  '/api/3/custom/pop_file_upload',
            dataType:'json',
            data: form_data,
            enctype: 'multipart/form-data',
            contentType: false,
            cache: false,
            processData: false,
            success: function(data) {
                console.log('Success!');
            },
            beforeSend:function(){
                console.log("file upload start");
            },
            complete:function(){
                $(target).val('');
                console.log("file upload end");
            }
       });
    }

chrome调试网络

    Form Data
    ------WebKitFormBoundaryH3daMRABWxXq3BDS
    Content-Disposition: form-data; name="file"; filename="industry.jpg"
    Content-Type: image/jpeg
    
    
    ------WebKitFormBoundaryH3daMRABWxXq3BDS--
    

python 来源

    def read_body(self, environ):
        stream = environ['wsgi.input']
        length = int(environ.get('CONTENT_LENGTH', 0))
        log.debug("read_body=================%s" % length)
        body = TemporaryFile(mode='w+b')
        while length > 0:
            part = stream.read(min(length, 1024 * 200))  # 200KB buffer size
            if not part: break
            body.write(part)
            length -= len(part)
        body.seek(0)
        environ['wsgi.input'] = body
        return body

    def pop_file_upload(self, environ, start_response):
        body = self.read_body(environ)
        log.debug("pop_file_upload=================%s" % body)
    
        filefield = cgi.FieldStorage(environ=environ, fp=body, keep_blank_values=1)
        log.debug("pop_file_upload=================%s" % filefield)
        if isinstance(filefield, list):
            # Multiple files uploaded
            log.debug('<p>Check uploaded multiple images: </p>')
            for fileitem in filefield:
                fn = os.path.basename(fileitem.filename)
                log.debug("file_name===%s"% fn)
                with open("upload/{}".format(fn), 'wb') as f:
                    f.write(fileitem.file.read())
                log.debug('<img width="200" height="auto" src="upload/{}" /><br><br>'.format(fn))
        else:
            # Single file uploaded
            log.debug('<p>Check uploaded image: </p>')
            fn = os.path.basename(filefield['file'].filename)
            log.debug("file_name===%s" % fn)
            with open("upload/{}".format(fn), 'wb') as f:
                f.write(filefield.file.read())
            log.debug('<img width="200" height="auto" src="upload/{}" />'.format(fn))

环境

    'wsgi.input': <FakeCGIBody at 0x7f798f891610 viewing MultiDict([('fi...'))])>, 

错误

    1. `length = int(environ.get('CONTENT_LENGTH', 0))` allways zero..
       * `environ.get('CONTENT_LENGTH', 0)` Notfound..return zero
    2. `pop_file_upload=================FieldStorage(None, None, [])` <- empty
    3. `fn = os.path.basename(filefield['file'].filename)` <- KeyError

帮助

Why can't I access the file information?

Is there anything I missed?

please give me a hint

ckan、wsgi 和python 的通信方式不完全清楚。但是,只有CGI body数据进入“environ”,当使用该数据创建“wsgi.input”时,“FieldStorage”没有正常创建。原因是它已经是文件存储的形式。 但是,“wsgi.input”是一个cgi对象,不能作为read读取。 最终解是通过读取“webob._parseed_post_vars”

的数据进行处理的