在BAE搭建的Django中实现图片上传并用jquery预览图片

在BAE上搭建好了django,如何实现图片上传并预览呢?

想要实现图片上传并不难,但是想看到刚上传的图片,就得在服务器返回上传后图片的url。可是返回数据的话,网页就会重定向。因此想要在上传页面预览图片,就得采用异步的方式,本文将使用jQuery.form.js来实现。具体关于jquery.form.js的文档请参看http://malsup.com/jquery/form/#getting-started

首先,来看一个小例子:

[html]  view plain  copy
  1. <html>  
  2.       
  3.     <head>  
  4.         <title>  
  5.             upload  
  6.         </title>  
  7.         <script type="text/javascript">  
  8.             function checkFile() {  
  9.                 document.getElementById("test").src = "http://apps.bdimg.com/developer/static/04192014/developer/images/logo.png"  
  10.             }  
  11.         </script>  
  12.     </head>  
  13.       
  14.     <body>  
  15.         <input onchange="checkFile();" type="file" />  
  16.         <br/>  
  17.         <img id="test" src="" width="277" height="46">  
  18.     </body>  
  19.   
  20. </html>  

保存为a.html用浏览器打开之后,显示如下:


点击选择文件,选中某个文件之后,可以看到网页显示如下:


其实,我们需要的就是类似的效果实现。选择图片并上传之后,可以在本页看到刚刚上传的图片。

下面就介绍一下如何在BAE搭建django中实现此功能:

首先,在template下写一个uploadPic.html,代码如下:

[html]  view plain  copy
  1. <!DOCTYPE>  
  2. <html lang="zh-CN">  
  3.       
  4.     <head>  
  5.         <meta charset="utf-8">  
  6.         <title>  
  7.             上传图片  
  8.         </title>  
  9.   
  10.         <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.7/jquery.js">  
  11.         </script>  
  12.         <script src="http://malsup.github.com/jquery.form.js">  
  13.         </script>  
  14.   
  15.         <script type="text/javascript">  
  16.             (function() {  
  17.   
  18.                 $('#myform').ajaxForm({  
  19.                     success: function(data) {  
  20.                         var img = document.getElementById("preview_img");  
  21.                         img.src = data.imgurl;     
  22.                         img.style.display = 'block';  
  23.                     }   
  24.                 });  
  25.   
  26.             })();  
  27.         </script>  
  28.   
  29.         <style>  
  30.             .Image {  
  31.                 max-width:600px;height:auto;cursor:pointer;  
  32.                     border:1px dashed #4E6973;padding: 3px;  
  33.                     }  
  34.         </style>   
  35.     </head>  
  36.       
  37.     <body>  
  38.         <form id="myform" action="/upload/uploadPic" method="post" enctype="multipart/form-data">  
  39.             <!-- {% csrf_token %} -->  
  40.             <input type="file" name="photo" id="image_upload" />  
  41.             <br>  
  42.             <input type="submit" value="上传" />  
  43.         </form>  
  44.         <img id="preview_img" src="" width="300" height="200" class="Image" style="display:none">  
  45.     </body>  
  46.   
  47. </html>  

当点击“上传”按钮之后会去执行 ajaxForm()方法,如果post成功之后会获得服务端返回的数据,并在img中设置src来显示图片。

首先看一下图片上传成功时候显示的页面【图片1】:


再看一下如果上传的文件不是图片时,显示的效果【图片2】:


这里的效果需要在服务端实现,具体服务端的代码可以参考如下:

[python]  view plain  copy
  1. def uploadPic(rq):  
  2.     file = rq.FILES['photo']  
  3.     oldFileName = file.name  
  4.     fileExt = oldFileName.split('.')[-1]  
  5.     if fileExt != 'jpg' and fileExt != 'jpeg' and fileExt != 'png':  #标记1  
  6.         response = HttpResponse()  
  7.         response['Content-Type'] = "application/json"  
  8.         imgurl = "http://bcs.duapp.com/mybucket/image/error_upload.jpg"  
  9.         json = "{\"status\":\"fail\", \"imgurl\":\"" + imgurl + "\"}"  #标记2  
  10.         response.write(json)  
  11.         return response  
  12.   
  13.     HOST = 'http://bcs.duapp.com/'  
  14.     AK = 'xxxxxx'            
  15.     SK = 'xxxxxx'             
  16.     bbcs = bcs.BaeBCS(HOST, AK, SK)   #标记3  
  17.       
  18.     bucketName = "mybucket"  
  19.     saveFileName = str('/upload/'  + oldFileName) #标记4  
  20.     saveFileData = file.read()  
  21.   
  22.     bbcs.put_object(bucketName, saveFileName, saveFileData)  
  23.       
  24.     response = HttpResponse()  
  25.     response['Content-Type'] = "application/json"  
  26.     imgurl = "http://bcs.duapp.com/mybucket"+ saveFileName  
  27.     json = "{\"status\":\"success\", \"imgurl\":\"" + imgurl + "\"}"  
  28.     response.write(json)  
  29.     return response  

代码不难理解,不要忘了添加几个包的引用:

[python]  view plain  copy
  1. from bae.api import bcs   
  2. from django.http import HttpResponse  


这里对几个标记点进行一下说明:

#标记1:对上传的文件类型进行判断,因为只做图片上传,所以得判断当前文件是否为图片,如果不为图片则返回上面的【图片2】。

#标记2:返回的json需要用转义字符 \" 来代替json的 ' 和 ",如果定义的json={'status':'fail', 'imgurl':'http://xx.xx.xx/xx.jpg'},这种方式返回的是json数据,页面会进行重定向,ajaxForm中的success方法就不执行。

#标记3:当你在百度云存储创建一个bucket之后,会获得该bucket的ACCESS_KEY和SECRET_KEY,开发指南参看:http://developer.baidu.com/wiki/index.php?title=docs/cplat/stor/guide ,django在BAE上要进行文件上传,保存的地方在百度云存储,具体百度云存储的API请参看:http://pythondoc.duapp.com/bcs.html

#标记4:因为oldFileName=rq.FILES['photo'].name这种方式获得的字符串为unicode,得进行格式转换,所以用了str()函数

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值