2011-04-09 17 views
0

我有表單上傳和處理程序,它允許從blobstore下載上傳的文件。 問題是當我點擊任何相關字段的下載按鈕時,它會每次下載相同的文件。即我上傳了3個文件(1.txt,2.txt,3.txt),並且每當我點擊另一個下載按鈕時,它總是隻下載1.txt文件。你可以在http://my77notes.appspot.com/show(或http://my77notes.appspot.com/upload首先上傳你自己的文件)看到它。 當我研究了源代碼時,它顯示了每個隱藏字段的不同鍵。 我錯了什麼?使用Blobstore檢索的Wring文件

這裏是我的文件:

模板文件:

<h2>Files uploaded to Blobstore</h2> 
<table border="3"> 
    <tr> 
     <td>#</td> 
     <td>Filename</td> 
     <td>Content-Type</td> 
     <td>Creation</td> 
     <td>Size</td> 
     <td>Download</td> 
    </tr> 
<form id="show_blob" name="show_blob" method="post" action="{{ download_blob }}"> 
    {% for file in blob_files %} 
    <tr> 
     <td>{{ loop.index }}</td> 
     <td>{{ file.filename }}</td> 
     <td>{{ file.content_type }}</td> 
     <td>{{ file.creation }}</td> 
     <td>{{ file.size }}</td> 
     <td> 
      <input type="submit" name="download" value="Download"/> 
      <input type="hidden" name="blobkey" value="{{ file.key() }}" /> 
     </td> 
    </tr> 
    {% endfor %} 
</form> 
</table> 

handler.py

class BlobstoreServeHandler(RequestHandler, BlobstoreDownloadMixin): 
    def post(self): 
     blob_info = blobstore.BlobInfo.get(self.request.form.get('blobkey')) 
     return self.send_blob(blob_info, save_as=True) 

urls.py

rules = [ 
     Rule('/', endpoint='index', handler='apps.77notes.handlers.IndexPageHandler'), 
     Rule('/upload', endpoint='upload/html', handler = 'apps.77notes.handlers.BlobstoreUploadFormHandler'), 
     Rule('/upload/handler', endpoint='upload/handler', handler='apps.77notes.handlers.UploadHandler'), 
     Rule('/download', endpoint='download/html', handler = 'apps.77notes.handlers.BlobstoreDownloadFormHandler'), 
     Rule('/download/file', endpoint='download/file', handler='apps.77notes.handlers.BlobstoreServeHandler'), 
     Rule('/show', endpoint='show/html', handler='apps.77notes.handlers.ShowUploadedFilesHandler'), 
] 

變量

blob_files = uploaded_files_to_blobstore = blobstore.BlobInfo.all() 
download_blob = self.url_for('download/file') 

謝謝!

回答

0

當然,它總是第一個。您正在聲明三個具有相同名稱但具有不同值的隱藏字段。服務器如何理解你想要「離我點擊的下載按鈕最近的隱藏域」?

你可以用Javascript做到這一點,但它是矯枉過正。也許你應該爲每個項目創建表單,但我不確定它是否是HTML有效的。

{% for file in blob_files %} 
<tr> 
    <!-- stuff --> 
    <td><form class="show_blob" name="show_blob" method="post" action="{{ download_blob }}"> 
     <input type="submit" name="download" value="Download" /> 
     <input type="hidden" name="blobkey" value="{{ file.key() }}" /> 
    </form></td> 
</tr> 
{% endfor %} 

如果您不喜歡這樣,您還可以在下載提交按鈕中提供所需blobkey的索引。事情是這樣的:

{% for file in blob_files %} 
<tr> 
    <!-- stuff --> 
    <td> 
     <input type="submit" name="dl{{ loop.counter0 }}" value="Download" /> 
     <input type="hidden" name="blobkey" value="{{ file.key() }}" /> 
    </td> 
</tr> 
{% endfor %} 

然後,服務器端,你用得到正確的BlobKey:

# don't forget to handle errors here, NTUI 
ind = int([_[2:] for _ in self.request.form if _.startswith('dl')][0]) 
blobkeys = self.request.form.getlist('blobkey') 
blobkey = blobkeys[ind] 

# stuff 
+0

'IND = INT([_ [2做到這一點:對於_在SE lf.request.form if _.startswith('dl')] [0]) - 你確定它是有效的代碼嗎? – VladG 2011-04-09 08:59:27

0

,如果你有什麼要通過形式的下載,你需要做的儘可能多的形式爲BLOB你有

{% for file in blob_files %} 
<tr> 
    <td>{{ loop.index }}</td> 
    <td>{{ file.filename }}</td> 
    <td>{{ file.content_type }}</td> 
    <td>{{ file.creation }}</td> 
    <td>{{ file.size }}</td> 
    <td> 
     <form id="show_blob" name="show_blob" method="post" action="{{ download_blob }}"> 
     <input type="submit" name="download" value="Download"/> 
     <input type="hidden" name="blobkey" value="{{ file.key() }}" /> 
     </form> 
    </td> 
</tr> 
{% endfor %} 

,或者您可以通過普通的標籤,這樣<a href = '/get/{{ file.key() }}'>