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”
的数据进行处理的
开发环境
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”
的数据进行处理的