Django文件上傳三種方式以及簡單預覽功能


 主要內容:

一、文件長傳的三種方式

二、簡單預覽功能實現

一、form表單上傳

1.頁面代碼

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<form action="{% url 'upload' %} " method="post" enctype="multipart/form-data">
    {% csrf_token %}
    <input type="file" name="img">
    <input type="submit">
</form>
</body>
</html>

2.后端view函數處理

def upload(request):
    if request.method=="GET":
        return  render(request,'upload.html')
    elif request.method=="POST":
        res={"status":"success","code":999}
        img_obj=request.FILES.get('img')#獲取文件對象
        with open(os.path.join('static',img_obj.name),"wb") as f:
            for chunk in img_obj.chunks(chunk_size=1024):
                f.write(chunk)
        return HttpResponse(json.dumps(res))
二、利用Jquery中ajax+FormData實現上傳文件

FormData使用方式:

  • 創建一個空的FormData對象,然后再用append方法逐個增加鍵值對

  var formdata = new FormData();
  formdata.append("name","xx");
  formdata.append("flie", filename);

  • 取得form元素對象,將它作為參數傳入FormData對象中。

  var formOjb = document.getElementById("form");
  var formdata = new FormData(formOjb );

  • 利用form元素對象的getFormData方法生成它

  var formobj = document.getElementById("form");
  var formdata = formobj.fetFormData();

 

1.頁面代碼

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>

<form action="{% url 'upload' %} " method="post" enctype="multipart/form-data">
    {% csrf_token %}
    <input type="file" name="img">
</form>
<span style="padding: 5px;color: royalblue" onclick="Jqajax();">jq上傳</span>
<script type="text/javascript" src="/static/jquery-2.1.1.min.js"></script>
<script type="text/javascript" src="/static/jquery.cookie.js"></script>
<script>

    function Jqajax() {
       var file_obj=$('input[name="img"]')[0].files[0];//獲取dom形式的文件對象
       var form_obj=new FormData();   //創建formdata對象
       form_obj.append('img',file_obj);   //將文件對象加載formdata中
        $.ajaxSetup({                     //設置csrf_token
            beforeSend: function (xhr, settings) {
                    xhr.setRequestHeader("X-CSRFToken", $.cookie("csrftoken"));
            }
        });
       $.ajax({
           type: 'POST',
           url: '{% url 'upload' %}',
           data: form_obj,//指明發送的文件對象
           processData: false, // 告訴jquery要傳輸data對象
           contentType: false,   // 告訴jquery不需要增加請求頭對於contentType的設置
                success: function (data) {
                    console.log(data)
           }
       })
    }
</script>
</body>
</html>

后端處理邏輯不變

三、基於iframe實現偽ajax文件上傳

原理:iframe數據提交不刷新頁面

好處:通過iframe的src屬性進行上傳功能,這樣的好處不用依賴FormData對象,低版本瀏覽器可能不支持該對象。

前端頁面

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
 <form action="{% url 'upload' %}" method="post" target="iframe_1" enctype="multipart/form-data">
     {% csrf_token %}
        <iframe style="display: none"  id="iframe_1" name="iframe_1" src=""></iframe>
        <input type="file" name="img" />
        <input type="submit" onclick="iframeSubmmit();" value="iframe上傳"/>
    </form>
<script type="text/javascript" src="/static/jquery-2.1.1.min.js"></script>
<script type="text/javascript" src="/static/jquery.cookie.js"></script>
<script>
function iframeSubmmit() {
 $('#iframe_1').load(function () {//用戶獲取上傳成功以后的返回值
    var text=$('#iframe_1').contents().find('body').text();
    var obj=JSON.parse(text);
    console.log(obj) ;
 })
}
</script>
</body>
</html>

后端處理邏輯一樣

四、圖片預覽功能

原理:通過圖片上傳時候服務端返回文件路徑,然后使用js設置a標簽src屬性實現預覽功能

后端代碼:

def upload(request):
    if request.method=="GET":
        return  render(request,'upload.html')
    elif request.method=="POST":
        img_obj=request.FILES.get('img')#獲取文件對象
        file_path=os.path.join('static',img_obj.name)
        res={"status":"success","code":999,"file_path":file_path}
        with open(os.path.join(file_path,"wb") as f:
            for chunk in img_obj.chunks(chunk_size=1024):
                f.write(chunk)
        return HttpResponse(json.dumps(res))

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM