2016-03-15 5 views
0

Я новичок в движке Google с помощью python, пожалуйста, помогите мне!Google app engine с python

Вот мой HTML-код:

<form action="" method="POST">  
    <div class="form-group"> 
     <label for="uploaded_file">Attached file:</label> 
     <input type="file" id="uploaded_file" name="uploaded_file"> 
    </div> 
    <div class="form-group"> 
     <button class="btn-primary" type="submit">Save note</button> 
    </div> 
</form> 

Вот мой питон код:

def post(self): 
    uploaded_file = self.request.POST.get('uploaded_file')  
    file_name = getattr(uploaded_file, 'filename', None) 
    file_content = getattr(uploaded_file, 'file', None) 
    if uploaded_file: 
     self.response.out.write(uploaded_file) 
     self.response.out.write(file_name) 
     self.response.out.write(file_content) 

развернуть свой проект на приложение двигателя Google и посетить веб-сайт. Я выбираю изображение и нажимаю кнопку отправки, он может показывать uploaded_file (имя файла). Но, file_name и file_content показывают None.

Если я изменить мой код:

def post(self): 
    uploaded_file = self.request.POST.get('uploaded_file')  
    file_name = getattr(uploaded_file, 'filename') 
    file_content = getattr(uploaded_file, 'file') 

Он покажет:

File "C:\Users\pc2\Desktop\test\main.py", line 98, in post 
    file_name = getattr(uploaded_file, 'filename') 
AttributeError: 'unicode' object has no attribute 'filename' 

Кто-то поможет мне получить файл или изображение, пожалуйста!

+0

Вы проверили образцы здесь? : https://cloud.google.com/appengine/docs/python/blobstore/#Python_Uploading_a_blob –

+0

Я забыл что-то сказать: я хочу загрузить свой файл в Google Cloud Storage, а не в Blobstore. Я так сори ... –

ответ

1

В вашей форме вам необходимо указать атрибут «enctype», чтобы загруженные файлы обрабатывались правильно - см. this answer for more details on enctype. Ваша форма тег должен выглядеть следующим образом:

<form action="" method="POST" enctype="multipart/form-data"> 

Измените метод после этого:

def post(self): 
    uploaded_file = self.request.POST.get('uploaded_file')  
    file_name = getattr(uploaded_file, 'filename', None) 
    file_content = getattr(uploaded_file, 'file', None) 
    if uploaded_file is not None: 
     self.response.out.write(uploaded_file) 
     self.response.out.write(file_name) 
     self.response.out.write(file_content) 

Изменение здесь меняется if uploaded_file: к if uploaded_file is not None:. Это связано с тем, что успешно загруженный файл не будет ничем, но все равно не сможет выполнить исходный тест. Я бы оставил аргументы «Нет» для getattr на месте - это предотвратит исключения, если пользователь нажмет кнопку «Отправить», но не загрузил файл.

Наконец, загруженные файлы не имеют атрибута file_content, поэтому это всегда будет None. Если вы хотите, чтобы доступ к необработанным байт самого файла вам нужно будет сделать

file_content = uploaded_file.file.read() 

Обратите внимание, что содержимое файла может быть очень большим, и не будет отображаться как изображение, если вы просто записать его в ответ - ты» Просто посмотрим на необработанные байты.

+0

Thanksssssssssssssssssssssssss !!!!! Это работает !!!!!! –