Python 使用Blobstore检索的Wring文件
我有表单上传和处理程序,允许从blobstore下载上传的文件。 问题是,当我单击任何相关字段的下载按钮时,它每次都会下载相同的文件。也就是说,我上传了3个文件(1.txt、2.txt、3.txt),每当我点击另一个下载按钮时,它总是只下载1.txt。您可以在(或首先上传您自己的文件)查看它。 当我研究源代码时,它会为每个隐藏字段显示不同的键。。 我做错了什么 这是我的档案: 模板文件:Python 使用Blobstore检索的Wring文件,python,jinja2,blobstore,tipfy,Python,Jinja2,Blobstore,Tipfy,我有表单上传和处理程序,允许从blobstore下载上传的文件。 问题是,当我单击任何相关字段的下载按钮时,它每次都会下载相同的文件。也就是说,我上传了3个文件(1.txt、2.txt、3.txt),每当我点击另一个下载按钮时,它总是只下载1.txt。您可以在(或首先上传您自己的文件)查看它。 当我研究源代码时,它会为每个隐藏字段显示不同的键。。 我做错了什么 这是我的档案: 模板文件: <h2>Files uploaded to Blobstore</h2> <t
<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>
url.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)
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')
谢谢 当然,它总是第一个。您正在声明三个同名但值不同的隐藏字段。服务器怎么能理解您想要“最靠近我单击的下载按钮的隐藏字段” 你可以用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 %}
如果您想通过表单下载什么,您需要尽可能多地使用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 %}
{%用于blob_文件中的文件%}
{{loop.index}}
{{file.filename}
{{file.content_type}
{{file.creation}
{{file.size}
{%endfor%}
或者,您可以通过像这样的普通标记来执行此操作
ind=int([[u2:]对于self.request.form中的[uu],如果[uu.startswith('dl')][0])
-您确定这是有效的代码吗?
# 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
{% 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 %}