에 파일을 업로드할 수 있습니 Google App Engine
-
09-06-2019 - |
문제
내 계획을 만들이 웹으로 사용하는 다운그레이드 visual studio 프로젝트 파일입니다.그러나,그것은 Google App Engine 지 파일을 업로드하고 평평한 파일에 저장하는 Google 서버를 통해 db.TextProperty
고 db.BlobProperty
.
드리겠습니다 누군가를 제공할 수 있는 코드 샘플을(클라이언트와 서버쪽)에 어떻게 이 작업을 수행할 수 있습니다.
해결책
여기에서 작동하는 전체 파일입니다.나는 원래에서 Google 사이트하고 수정하도록 그것을 약간 더다.
몇 가지 예:
- 이 코드를 사용하여 BlobStore API
의 목적을 이 라인에서 ServeHandler 클래스는"수정" 키 그래서 그것을 제거한 모든 이름 mangling 발생할 수 있는지에 브라우저(지 않았을 관찰서 크롬)
blob_key = str(urllib.unquote(blob_key))
는"save_as"절의 끝에서 이것은 중요합니다.그것은 것입니다 있는지 확인하는 파일의 이름을 얻지 않는 손상을 때는 그것이 귀하의 브라우저에 보내.그것을 제거하는 어떻게 관찰합니다.
self.send_blob(blobstore.BlobInfo.get(blob_key), save_as=True)
행운을 빕니다!
import os
import urllib
from google.appengine.ext import blobstore
from google.appengine.ext import webapp
from google.appengine.ext.webapp import blobstore_handlers
from google.appengine.ext.webapp import template
from google.appengine.ext.webapp.util import run_wsgi_app
class MainHandler(webapp.RequestHandler):
def get(self):
upload_url = blobstore.create_upload_url('/upload')
self.response.out.write('<html><body>')
self.response.out.write('<form action="%s" method="POST" enctype="multipart/form-data">' % upload_url)
self.response.out.write("""Upload File: <input type="file" name="file"><br> <input type="submit" name="submit" value="Submit"> </form></body></html>""")
for b in blobstore.BlobInfo.all():
self.response.out.write('<li><a href="/serve/%s' % str(b.key()) + '">' + str(b.filename) + '</a>')
class UploadHandler(blobstore_handlers.BlobstoreUploadHandler):
def post(self):
upload_files = self.get_uploads('file')
blob_info = upload_files[0]
self.redirect('/')
class ServeHandler(blobstore_handlers.BlobstoreDownloadHandler):
def get(self, blob_key):
blob_key = str(urllib.unquote(blob_key))
if not blobstore.get(blob_key):
self.error(404)
else:
self.send_blob(blobstore.BlobInfo.get(blob_key), save_as=True)
def main():
application = webapp.WSGIApplication(
[('/', MainHandler),
('/upload', UploadHandler),
('/serve/([^/]+)?', ServeHandler),
], debug=True)
run_wsgi_app(application)
if __name__ == '__main__':
main()
다른 팁
사실,이 질문에 대답 앱 Egnine 문서입니다.예를 참조하십시오에 업로드 사용자 이미지.
HTML 코드,내부는 <form></form>:
<input type="file" name="img"/>
Python 코드:
class Guestbook(webapp.RequestHandler): def post(self): greeting = Greeting() if users.get_current_user(): greeting.author = users.get_current_user() greeting.content = self.request.get("content") avatar = self.request.get("img") greeting.avatar = db.Blob(avatar) greeting.put() self.redirect('/')
구글은 발표 저장하기 위한 서비스 파일이 있습니다.보 blobstore API 설명서.파일이 있는 경우>1MB,당신은 그것을 사용해야 한다.
나는 그것을 시도 오늘날,그것은 다음과 같다:
내 sdk 버전 1.3.x
html 페이지:
<form enctype="multipart/form-data" action="/upload" method="post" >
<input type="file" name="myfile" />
<input type="submit" />
</form>
서버 코드:
file_contents = self.request.POST.get('myfile').file.read()
는 경우에 당신의 문제가 계속 사용하여 확인하 enctype 양식에서 태그
No:
<form encoding="multipart/form-data" action="/upload">
예:
<form enctype="multipart/form-data" action="/upload">
할 수 있는지 파일을 저장되지 않는 전통적인 파일 시스템입니다.당신이 저장할 수 있습니다 그들 자신의 데이터 저장소(에서 정의된 필드로 BlobProperty)
가 예제에서는 이전의 링크:
class MyModel(db.Model):
blob = db.BlobProperty()
obj = MyModel()
obj.blob = db.Blob( file_contents )
개인적으로 내가 찾는 튜토리얼을 설명 기 유용한 사용할 때는 자바 런타임 GAE.몇 가지 이유 때,나는 시도를 사용하여 파일을 업로드
<form action="/testservelet" method="get" enctype="multipart/form-data">
<div>
Myfile:<input type="file" name="file" size="50"/>
</div>
<div>
<input type="submit" value="Upload file">
</div>
</form>
내가 찾는 나 HttpServlet 클래스에 대한 몇 가지 이유를 받아들이지 않을 것 양식을 가진'enctype'특성이 있습니다.그것을 제거 작업,그러나,이것을 업로드할 수 있는 모든 파일이 있습니다.
없 평 파일에 저장하는 Google App Engine.모든 것을 가을 데이터 저장소 조금처럼 관계형 데이터베이스 그러하지 않습니다.
당신이 저장할 수 있는 파일로 TextProperty 나 BlobProperty 특성이 있습니다.
가 1MB 한 데이터 저장소 항목을 수도 있습니다 또는 문제가 되지 않습니다.
저도 몇 가지 이상한 행동을 할 때에 파일을 업로드하는용 엔진입니다.제출하는 경우 다음과 같은 형식으로 제공합니다.
<form method="post" action="/upload" enctype="multipart/form-data">
<input type="file" name="img" />
...
</form>
그리고 당신은 추출 img
요청에서 다음과 같다:
img_contents = self.request.get('img')
이 img_contents
변수 str()
Chrome 에서지만,그것은에서 유니코드 파이어 폭스.그리고 당신 지금 db.Blob()
생성자 문자열을 사용하고 오류가 발생한 경우에는 유니코드 문자열입니다.
가 누구나 알고 어떻게 이 문제를 해결할 수 있습니다?
또한,무엇을 찾을 절대적으로 이상은 그 때 나는 복사 및 붙여넣기 방명록 응용 프로그램(아바타와),그것은 완벽하게 작동합니다.나는 모든 일을 정확히 동일한 방식에서 내 코드,하지만 그것은 단지 작동하지 않습니다.나는 매우 가까운 당.
가 사용하는 방법 평면 파일 시스템(어야에서 사용 관점)
이 Google App Engine 가상 파일시스템 프로젝트.그 구현의 도움으로 데이터 저장소 및 memcache Api 를 모방하는 일반 파일 시스템으로 넘어갑니다.이 라이브러리를 사용하여 사용할 수 있습에서 당신은 프로젝트 비슷한 파일시스템에 액세스(읽기 및 쓰기).