2016-05-06 78 views
0

我有當用戶點擊一個按鈕,動態生成KML或xml文件一些JavaScript代碼。我希望能夠將它生成後的文件上傳到我的Django服務器。用戶從他/她的計算機輸入文件時沒有文件輸入字段。該文件僅根據其他內容動態生成。上傳文件。

有沒有一種方法來模擬文件上傳而實際上不必在你的HTML表單,或許通過生成的JavaScript/jQuery的形式並以某種方式注入生成的文件形式?

請告知怎麼會這樣做。

這裏是處理的正常工作與用戶輸入的文件上傳我的Django的看法:

def file_upload(request): 
if request.is_ajax(): 
    if request.method == 'POST': 
     form = FileUploadForm(files=request.FILES) 
     instance = Files(user=request.user, file=request.FILES['file']) 
     instance.save() 
     return HttpResponse(json.dumps(list_files(request.user))) 
else: 
    return HttpResponse(json.dumps(list_files(request.user))) 
+0

你必須解釋一下你的 「一號文件」 的意思 - 如果是由JavaScript生成客戶端上的 「文件」(因此需要一個文件上傳控件),那麼它將*不*是存儲在硬盤驅動器(所以不再需要一個文件上傳控件)上的文件,而只是在一個可變的一些文字,可以在文本的地方或隱藏的輸入。 –

回答

0

好像你遇到困難,作出適當的Ajax請求。

正如@ freedomn米評論說,「文件」你提到目前只只存在於內存中。

所以處理這個問題的最好方法就是不要使用FileUploadForm來接收服務器端的數據,因爲您沒有任何文件需要上傳。只要使用處理普通字符串的東西就足夠了。

讓我們在你的js代碼說,你現在存儲您生成的xml在var xmlFile

var xhr = new XMLHttpRequest(); 
xhr.open('POST', '/your_url'); 
xhr.setRequestHeader('Content-Type', 'text/plain') 
xhr.send(xmlFile); 

在Django:

if request.is_ajax(): 
if request.method == 'POST': 
    file_content = request.body 
    instance = Files(user=request.user, file=ContentFile(file_content)) 
    instance.save() 
    return HttpResponse(json.dumps(list_files(request.user))) 

就是這樣。

參考文獻:

  1. https://docs.djangoproject.com/en/1.9/ref/request-response/#django.http.HttpRequest.body
  2. https://docs.djangoproject.com/en/1.9/ref/files/file/#the-contentfile-class