2017-06-18 16 views
0

我正在創建一個web應用程序,向用戶顯示圖像並且用戶可以在圖像上繪製(基本上圖像位於畫布中)。Django request.FILES在保存畫布圖像時爲空

現在一旦用戶完成繪圖,用戶將按下保存按鈕,圖像需要保存在靜態文件夾(不是本地)中。因爲我正在使用Django來完成這個任務;我的請求。每當我呼叫路由時,FILES總是空的。

我的問題是如何保存用戶畫到項目文件夾而不是本地的畫布。

的index.html

<div id="uploaderForm"> 
     <form enctype="multipart/form-data" action="{% url 'addImg' %}" method="post"> 
      <input type="hidden" for="image_data" id="image_data" name="image_data" /> 
     </form> 

     <div class="uploaderItem" id="uploaderSubmit"> 
      <a href="#" onclick="addImage();">Add to the gallery</a> 
     </div> 
</div> 

的script.js

function addImage() 
{ 
    console.log("In add image"); 
    var image_data = canvas.toDataURL(); 
    console.log("Image data:", image_data); 
    $('#image_data').val(image_data); 
    $('#uploaderForm > form').submit() 

} 

views.py

def add(request): 
    print request.FILES 
    #print request.POST['image_data'] 
    return HttpResponse("You're looking at question") 

回答

0

的FILES陣列保留用於通過多部分表單上載到文件輸入字段中的文件。你正在做的是將代表你的圖像的base-64編碼的字符串傳遞給一個隱藏的文本字段,然後發送到你的服務器。通過你的代碼,圖像應該在這裏找到:

image_data = request.POST.get('image_data') 

這將是一個基於64位的字符串,所以你需要對其進行解碼,下面的例子可以適用於幾乎任何數據URL,但格式將取決於您的瀏覽器,所以它有點棘手:

import re 
pattern = r'^data:(?P<mime_type>[^;]+);base64,(?P<image>.+)$' 
result = re.match(pattern, image_data) 
if result: 
    mime_type = result.group('mime_type') 
    image = result.group('image').decode('base64') 

注意:通過不使用文件傳輸,你基本上是傾倒在服務器的內存中的整體形象,這是昂貴的,如果你打算爲很多客戶提供服務,而且這也很耗時,所以在完成圖像之前,您的請求可能會超時。

爲了解決這個問題,您應該考慮通過AJAX上傳圖片,這是一種支持在JavaScript中處理Blob的方式,這樣您可以更有效地使用Django的文件上傳功能