终于搞定了 django 的 ajax 方式上传图片
2007-07-06 19:17
639 查看
[align=left]今天终于搞定了 django 的 ajax 方式上传图片。
客户端我用的是 jQuery 的插件 AjaxFileUpload, 其原理是动态创建一个 iframe 和一个 form, 将 <input type="file" /> 控件的内容插入到 form 中,然后向那个 iframe 提交。当然这里 iframe 通过样式设置为不可见的了。
调试的过程中出现了很多低级错误,但因为 ajax 方式很难调试,花费了不少的时间才搞定,中间连 Visual Studio 2005 都用上了,用于调试 JavaScript. 下面把错误记录下来给自己以后提个醒:
1. fileElementId 注意不要在前面加上 '#', 否则会找不到控件(用 jQuery 时间久了很容易犯这个错误)。
2. <input type="file" /> 控件一定要加上 name 属性!因为这个没加表单将不会发送任何有效的文件数据。低级错误啊~
3. 其他需要在文件上传时同时发送的字段,可以考虑拼接成一个字符串,加到 url 里面用 get 的方式发送到服务器。当然,要记得字段内容用 encodeURIComponent 函数预先处理。
下面附上一点主要的客户端调用代码:
$.ajaxFileUpload
(
{
url:'/popup/note/image_upload/?' + postData,
secureuri: false,
fileElementId: fileElementId,
dataType: 'json',
success: function (data, status)
{
if(typeof(data.error) != 'undefined'){
if(data.error != '')
alert(data.error);
else
alert(data.msg);
}
},
error: function (data, status, e)
{
alert(e.description);
for(k in data) alert(data[k]);
alert(status);
}
}
)
[/align]
有的时候文件的 name 是动态产生的,那么在服务器端, django 的 view 中,可以改用一种办法来获取上传文件的内容,而不需要知道控件的 name:
file_obj = request.FILES.values()[0]
而我们平常写的最多的是这样的:
file_obj = request.FILES.get('file1', None)
尚待解决的问题:
AjaxFileUpload 插件提供了一个简单的 ajax 等待提示功能,大致是这样的:
$(divid + " .loading").ajaxStart(function(){
$(this).show();
}).ajaxComplete(function(){
$(this).hide();
});
其原理就是用一个“等待中...” 类似的 gif 动画图标,当开始请求的时候显示,请求完了隐藏掉。
但是我发现它触发 ajaxStart, ajaxComplete 事件的时候,都是用的一种全局的机制,这会导致一个奇怪的事情,就是假如页面上有多个类似的上传表单(但是其中等待提示图标的 id 不同)时,提示的图标好像会乱掉,不该显示的显示。因为对 jQuery 插件机制还不熟悉,这个问题有待研究解决。
客户端我用的是 jQuery 的插件 AjaxFileUpload, 其原理是动态创建一个 iframe 和一个 form, 将 <input type="file" /> 控件的内容插入到 form 中,然后向那个 iframe 提交。当然这里 iframe 通过样式设置为不可见的了。
调试的过程中出现了很多低级错误,但因为 ajax 方式很难调试,花费了不少的时间才搞定,中间连 Visual Studio 2005 都用上了,用于调试 JavaScript. 下面把错误记录下来给自己以后提个醒:
1. fileElementId 注意不要在前面加上 '#', 否则会找不到控件(用 jQuery 时间久了很容易犯这个错误)。
2. <input type="file" /> 控件一定要加上 name 属性!因为这个没加表单将不会发送任何有效的文件数据。低级错误啊~
3. 其他需要在文件上传时同时发送的字段,可以考虑拼接成一个字符串,加到 url 里面用 get 的方式发送到服务器。当然,要记得字段内容用 encodeURIComponent 函数预先处理。
下面附上一点主要的客户端调用代码:
$.ajaxFileUpload
(
{
url:'/popup/note/image_upload/?' + postData,
secureuri: false,
fileElementId: fileElementId,
dataType: 'json',
success: function (data, status)
{
if(typeof(data.error) != 'undefined'){
if(data.error != '')
alert(data.error);
else
alert(data.msg);
}
},
error: function (data, status, e)
{
alert(e.description);
for(k in data) alert(data[k]);
alert(status);
}
}
)
[/align]
有的时候文件的 name 是动态产生的,那么在服务器端, django 的 view 中,可以改用一种办法来获取上传文件的内容,而不需要知道控件的 name:
file_obj = request.FILES.values()[0]
而我们平常写的最多的是这样的:
file_obj = request.FILES.get('file1', None)
尚待解决的问题:
AjaxFileUpload 插件提供了一个简单的 ajax 等待提示功能,大致是这样的:
$(divid + " .loading").ajaxStart(function(){
$(this).show();
}).ajaxComplete(function(){
$(this).hide();
});
其原理就是用一个“等待中...” 类似的 gif 动画图标,当开始请求的时候显示,请求完了隐藏掉。
但是我发现它触发 ajaxStart, ajaxComplete 事件的时候,都是用的一种全局的机制,这会导致一个奇怪的事情,就是假如页面上有多个类似的上传表单(但是其中等待提示图标的 id 不同)时,提示的图标好像会乱掉,不该显示的显示。因为对 jQuery 插件机制还不熟悉,这个问题有待研究解决。
相关文章推荐
- 终于搞定了 django 的 ajax 方式上传图片
- 终于搞定了 django 的 ajax 方式上传图片
- django 的 ajax 方式上传图片
- webuploader 图片上传插件 配合着表单提交 ajax方式
- MVC 使用AJAX POST上传图片的方式
- CI框架怎么使用ajax方式无刷新上传文件/图片
- laravel 图片上传 ajax 方式
- django之创建第10个项目-图片上传方式1
- 原生ajax和iframe框架实现图片文件上传的两种方式
- SpringMVC+ajaxFileUpload上传图片 IE浏览器弹下载框问题解决方式
- 用AJAX方式上传图片文件
- 谈谈django中图片上传的2种处理方式
- 终于搞定使用node.js +redis 作为服务端,提供图片上传存储服务
- vuejs使用FormData实现ajax上传图片文件
- java 将图片上传到webapp路径下 路径获取方式
- springmvc + ajaxfileupload 实现异步上传文件(图片)
- Simditor的图片上传(原理 + django实现)
- freemarker+springMVC+ajaxfileupload实现异步图片上传(多张)
- ajax实现上传图片保存到后台并读取的实例
- iOSBase64POST上传图片和FormData方式比较