Качете изображение в google cloud store чрез уеб страница от python, google app engine, angularjs

Първо нека кажа,

Мисля, че прочетох всяка публикация за обмен на стекове, която изглеждаше подходяща за тази тема.*

Какво се опитвам да направя:

  1. Опитвам се да разреша на определени потребители да изпратят изображение в облачно хранилище на Google чрез формуляр на моя сайт..
  2. Друго изискване заедно с изпращането на това изображение в облачното хранилище е, че трябва да създам модел на това изображение в хранилището за данни със съответните му атрибути.

Не съм сигурен кой е най-добрият начин да направя това, защото..

Подходи, за които съм чел:

Има куп подходи за получаване на изображения в облачното хранилище:

Прочетох много противоречива информация,

и прочетох толкова много, че не мога да го запазя правилно,

въпреки това,

Мисля, че решението беше:

За blobstore:

  1. Методът blobstore.uploadtocloudstoragethingthing може или не може да има размер на ограничение за качване на файл (не, това не е действителното извикване или име на метод) 2. Методът blobstore звучеше така, сякаш ще бъде премахнат??

За API на Jason:

Клиентската библиотека обаче включва оптимизации на App Engine, така че използването на REST API може да изисква допълнително време за разработка. Забележка: Сървърът за разработка на App Engine поддържа Cloud Storage Client. Не поддържа REST API.

За клиентската библиотека:

Не знам. Засега изглежда добре. Ето метода, който мисля да използвам:

cloudstorage.open(filename, mode='r', content_type=None, options=None, read_buffer_size=storage_api.ReadBuffer.DEFAULT_BUFFER_SIZE, retry_params=None)

В режим на четене (r) отваря посочения обект в Cloud Storage за четене. В режим на запис w, ако посоченият файл съществува, той го отваря за презапис (добавянето не се поддържа). Ако файлът не съществува, той се създава в посочената кофа.

Нещата, които използвам:

  1. Google App Engine
  2. Python (за манипулатори, модели и т.н.)
  3. angularjs и jquery (преден край)
  4. json понякога (backend)
  5. GAE шаблон (не питайте)

Какво мисля да направя:

  1. Вземете изображението на потребителя:

И така, намерих тази форма, която тествах. Той грабва файл от вашия компютър:

<form action="<?php echo $upload_url?>" enctype="multipart/form-data"
method="post">
Files to upload: <br>    <input type="file" name="uploaded_files"    size="40">    <input type="submit" value="Send">

(Не, не мога да използвам php junk в действието. Взех го от някое място в документите, но го тествах, той хваща файл, не, няма да изпрати и би било глупаво да го очаквам)

  1. Промяна на текущия ми манипулатор (който се грижи за създаването на модел на изображението в хранилището за данни), за да използва също

този метод:

cloudstorage.open(filename, mode='r', content_type=None, options=None, read_buffer_size=storage_api.ReadBuffer.DEFAULT_BUFFER_SIZE, retry_params=None)

В режим на четене (r) отваря посочения обект в Cloud Storage за четене. В режим на запис w, ако посоченият файл съществува, той го отваря за презапис (добавянето не се поддържа). Ако файлът не съществува, той се създава в посочената кофа.

Моите проблеми досега

Не знам как работи този формуляр и не знам как да получа правилната информация от този формуляр до манипулатор и от каква информация ще се нуждае този манипулатор, за да мога да го обработя, да създам модела (вече знам как да създадете модела в хранилището на данни, вече го правите), и също така да изпратите изображението в облачното хранилище на Google с този метод:

cloudstorage.open(filename, mode='r', content_type=None, options=None, read_buffer_size=storage_api.ReadBuffer.DEFAULT_BUFFER_SIZE, retry_params=None)

В режим на четене (r) отваря посочения обект в Cloud Storage за четене. В режим на запис w, ако посоченият файл съществува, той го отваря за презапис (добавянето не се поддържа). Ако файлът не съществува, той се създава в посочената кофа.

Може ли някой да ми даде пример? Не мога да намеря подходящи публикации или документи за това какво да поставя във формуляра, така че да грабне файла, да грабне другите данни от формуляра, които потребителят попълва, и след това да изпрати изображението в облачното хранилище на Google.

--АКТУАЛИЗАЦИЯ--:

И така, веднага след като публикувах това, потърсих в Google gcs.open, което доведе до тази публикация:

как да качите изображение в облачното хранилище чрез приложение двигател?

Вярвам, че това може да свърши работа, що се отнася до бекенда, остава ми един въпрос.

За да поставите отново въпроса:

от публикацията по-горе

Въпроси:

  1. Не знам какво ще бъде името на изображението, бих искал да използвам съществуващото или може би произволно. Предложения?

  2. Къде да залепя това: enctype=multipart/form-data?

  3. ще номер 2. бъркотия с другите ми данни от формуляра? Имам нужда от повече информация освен това изображение в заявката за публикация


person Community    schedule 30.07.2015    source източник


Отговори (2)


За да отговорите на вашите въпроси:

  1. Не знам какво ще бъде името на изображението, бих искал да използвам съществуващото или може би произволно. Предложения?

Не мисля, че това наистина има значение, просто не забравяйте да помислите за възможни сблъсъци с имена и какво би се случило тогава. Мисля, че това зависи най-вече от нуждите на вашето приложение. Винаги можете да използвате произволно име на файл и да запазите действителното име на файл в хранилището за данни до препратка към елемента Cloud Storage.

  1. Къде да залепя това: enctype="multipart/form-data"?

Enctype е атрибут на формуляр и затова трябва да бъде зададен на елемента на формуляра във вашия HTML:

<form enctype="multipart/form-data" action="/save" ... >
  1. номер 2. ще се забърква ли с другите ми данни от формуляра? Имам нужда от повече информация освен това изображение в заявката за публикация

Не, не трябва. Просто добавете повече полета за въвеждане на формуляр и всички те ще бъдат изпратени с данните на формуляра.

person sander    schedule 31.07.2015
comment
1. Благодаря :) в момента търся начини за използване на уникати. Мисля просто за генериране на име и след това да видя дали този файл съществува в gcs. Това обаче може да пропилее запитвания. 2. Благодаря! В крайна сметка използвах ‹form action={{ url|safe }} enctype=multipart/form-data method=post› и мина добре. 3. Все още не съм го пробвал, благодаря за информацията :) - person ; 31.07.2015
comment
Вярно за допълнителните запитвания. Това, което можете да направите (ако приемем, че съхранявате други данни в хранилището за данни за файла), е да използвате ключа за хранилището като име на файл. Това е гарантирано уникално. - person sander; 31.07.2015
comment
Това е интересна идея, бих се чудил какви рискове за сигурността биха могли да въведат в хранилището за данни, тъй като би било лесно да се разкрие името на ключа чрез браузъра, но добавянето на произволни данни върху този идентификатор може да помогне? може да се декодира вероятно. Не съм сигурен.. Направих друг проект, който използва уникати, но не помня метода, който използвах на ръка.. - person ; 31.07.2015
comment
Не мисля, че би имало притеснение при излагането на ключа на хранилището за данни, освен ако не използвате чувствителна ID част от ключа. Мислех обаче повече, че можете да използвате ключа, за да го съхраните (осигурявайки уникалност), но когато го извличате от Cloud Storage, за да го изпратите на потребителя, ще преименувате файла с оригиналното име на файл, което сте съхранили в хранилище за данни. - person sander; 31.07.2015
comment
Не съм сигурен как ще се случи това, тъй като облачното хранилище има действителното изображение, а моделът на данните съдържа пътя до това изображение. Ако те не са еднакви, не би било възможно да се покаже изображение на потребителя. Все пак намерих стария си код, все пак ще включва заявки към хранилището за данни и използва уникален клас от екстрите на webapp2 - person ; 31.07.2015
comment
Открих това днес. Можете също да използвате ключ на обект, за да получите кодиран низ, подходящ за вграждане в URL:url_string = sandy_key.urlsafe(), така че да се погрижи за проблема със сигурността или не: Забележка: Низът, безопасен за URL адрес изглежда загадъчно, но не е криптирано! Може лесно да бъде декодиран, за да възстанови вида и идентификатора на оригиналния обект: key = Key(urlsafe=url_string) kind_string = key.kind() ident = key.id() - person ; 31.07.2015
comment
Терминът ключ е леко подвеждащ. Ключът не е нищо повече от уникален идентификатор за обект чрез комбиниране на вида на обекта и ID на обекта в този вид заедно. Това не дава на някого никакъв вид достъп до нищо, така че няма нищо лошо някой да има ключ за обект. Освен ако, разбира се, не искате потребител да знае имената на вашите модели и идентификаторите на обекти, под които се съхраняват. Такъв би бил случаят може би, ако имате потребителски модел и използвате неговия имейл адрес като ID част на ключа на обекта. Това би означавало, че получавате нещо като Key('User', '[email protected]'). - person sander; 01.08.2015

Можете също така да използвате подписан формуляр за директно качване в GCS. По този начин нямате нужда от blobstore или пост манипулатор. И можете да контролирате времето за изчакване и името на обекта, като използвате документ за политика. Вижте моя отговор тук.

person voscausa    schedule 31.07.2015
comment
Не съм сигурен, че подписаният формуляр означава нещо -- имате предвид подписания URL, според cloud.google.com/storage/docs/access-control?hl=en#Signed-URLs ? - person Alex Martelli; 01.08.2015
comment
Мислех, че подписаният формуляр е по-подходящ за това решение. Документи: cloud.google.com/storage/docs/reference-methods#postobject - person voscausa; 01.08.2015