Wring файл, полученный с помощью Blobstore - PullRequest
0 голосов
/ 09 апреля 2011

У меня есть форма загрузки и обработчик, который позволяет загружать загруженные файлы из blobstore.Проблема в том, что когда я нажимаю кнопку «Загрузить» в любом соответствующем поле, он загружает один и тот же файл каждый раз.Т.е. я загрузил 3 файла (1.txt, 2.txt, 3.txt), и он всегда загружает только 1.txt всякий раз, когда я нажимаю на другую кнопку «Загрузить».Вы можете увидеть его на http://my77notes.appspot.com/show (или http://my77notes.appspot.com/upload для загрузки ваших собственных файлов).Когда я исследовал исходный код, он показывает разные ключи для каждого скрытого поля. Что я сделал не так?

Вот мои файлы:

файл шаблона:

<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')

Спасибо!

Ответы [ 2 ]

0 голосов
/ 21 июня 2011

если вам нужно скачать через форму, вам нужно заполнить столько форм, сколько у вас есть

{% 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 <a href = '/get/{{ file.key() }}'>

0 голосов
/ 09 апреля 2011

Конечно, это всегда первый.Вы объявляете три скрытых поля с одним и тем же именем, но разными значениями.Как сервер мог понять, что вы хотите «скрытое поле, ближайшее к кнопке загрузки, на которую я нажал»?

Вы можете сделать это с помощью 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 %}

Если вам это не нравится, вы также можете указать индекс нужного ключевого слова внутрикнопка отправки загрузки.Примерно так:

{% 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 %}

Затем на стороне сервера вы получите правильный блобкейв, используя:

# 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
...