복붙노트

[PYTHON] Google App Engine에서 파일 업로드

PYTHON

Google App Engine에서 파일 업로드

사용자가 자신의 비주얼 스튜디오 프로젝트 파일을 다운 그레이드 할 수있게 해주는 웹 응용 프로그램을 만들 계획입니다. 그러나 Google App Engine은 db.TextProperty 및 db.BlobProperty를 통해 Google 서버에 파일 업로드 및 플랫 파일 저장을 허용하는 것으로 보입니다.

이 작업을 수행하는 방법에 대해 누구나 코드 샘플 (클라이언트 측과 서버 측)을 제공 할 수있어서 기쁩니다.

해결법

  1. ==============================

    1.여기에 완전한 작업 파일이 있습니다. Google 사이트에서 원본을 가져 와서 조금 더 현실감있게 수정했습니다.

    여기에 완전한 작업 파일이 있습니다. Google 사이트에서 원본을 가져 와서 조금 더 현실감있게 수정했습니다.

    주의해야 할 몇 가지 사항은 다음과 같습니다.

    행운을 빕니다!

    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()
    
  2. ==============================

    2.사실,이 질문은 App Engine 설명서에서 답변을 얻습니다. 사용자 이미지 업로드의 예를 참조하십시오.

    사실,이 질문은 App Engine 설명서에서 답변을 얻습니다. 사용자 이미지 업로드의 예를 참조하십시오.

    안에있는 HTML 코드 :

    <input type="file" name="img"/>

    파이썬 코드 :

    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('/')
  3. ==============================

    3.그것에 대한 Google 그룹스에 스레드가 있습니다.

    그것에 대한 Google 그룹스에 스레드가 있습니다.

    파일 업로드

    유용한 코드가 많아서이 토론은 파일 업로드에 많은 도움이되었습니다.

  4. ==============================

    4.Google은 대용량 파일을 저장하는 서비스를 출시했습니다. blobstore API 문서를 살펴보십시오. 파일이 1MB를 초과하면 사용해야합니다.

    Google은 대용량 파일을 저장하는 서비스를 출시했습니다. blobstore API 문서를 살펴보십시오. 파일이 1MB를 초과하면 사용해야합니다.

  5. ==============================

    5.나는 그것을 오늘 시험해 본다, 그것은 다음과 같이 작동한다 :

    나는 그것을 오늘 시험해 본다, 그것은 다음과 같이 작동한다 :

    내 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() 
    
  6. ==============================

    6.여전히 문제가있는 경우 양식 태그에 enctype을 사용하고 있는지 확인하십시오.

    여전히 문제가있는 경우 양식 태그에 enctype을 사용하고 있는지 확인하십시오.

    아니:

    <form encoding="multipart/form-data" action="/upload">
    

    예:

    <form enctype="multipart/form-data" action="/upload">
    
  7. ==============================

    7.전통적인 파일 시스템이 없기 때문에 파일을 저장할 수 없습니다. BlobProperty로 정의 된 필드의 데이터 스토어에만 저장할 수 있습니다.

    전통적인 파일 시스템이 없기 때문에 파일을 저장할 수 없습니다. BlobProperty로 정의 된 필드의 데이터 스토어에만 저장할 수 있습니다.

    이전 링크에 예제가 있습니다.

    class MyModel(db.Model):
      blob = db.BlobProperty()
    
    obj = MyModel()
    obj.blob = db.Blob( file_contents )
    
  8. ==============================

    8.개인적으로 GAE에서 자바 런타임을 사용할 때 유용한 여기에 설명 된 자습서를 찾았습니다. 어떤 이유로, 파일을 업로드하려고 할 때

    개인적으로 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'특성을 가진 폼을 허용하지 않는다는 것을 알게되었습니다. 그러나 제거하면 작동하지 않아 파일을 업로드 할 수 없습니다.

  9. ==============================

    9.Google App Engine에는 플랫 파일 저장이 없습니다. 모든 것이 Datastore에 들어가야하는데, 이것은 관계형 데이터베이스와 조금 비슷하지만 확실히는 아닙니다.

    Google App Engine에는 플랫 파일 저장이 없습니다. 모든 것이 Datastore에 들어가야하는데, 이것은 관계형 데이터베이스와 조금 비슷하지만 확실히는 아닙니다.

    TextProperty 또는 BlobProperty 특성으로 파일을 저장할 수 있습니다.

    문제가 될 수도 있고 없을 수도있는 DataStore 항목에 1MB 제한이 있습니다.

  10. ==============================

    10.App Engine에 파일을 업로드 할 때 이상한 동작을 관찰했습니다. 다음 양식을 제출할 때 :

    App Engine에 파일을 업로드 할 때 이상한 동작을 관찰했습니다. 다음 양식을 제출할 때 :

    <form method="post" action="/upload" enctype="multipart/form-data">
        <input type="file" name="img" />
        ...
    </form>
    

    그런 다음 요청에서 img를 추출합니다.

    img_contents = self.request.get('img')
    

    img_contents 변수는 Google 크롬의 str ()이지만 Firefox에서는 유니 코드입니다. db.Blob () 생성자는 문자열을 받아 유니 코드 문자열을 전달하면 오류가 발생합니다.

    아무도 이것을 고칠 수있는 방법을 알고 있습니까?

    또한 내가 이상하게 생각하는 것은 방명록 응용 프로그램 (아바타 포함)을 복사하여 붙여 넣을 때 완벽하게 작동한다는 것입니다. 내 코드에서 모든 것을 똑같은 방식으로 처리하지만 작동하지 않습니다. 나는 머리카락을 꺼내는 데 아주 가깝다.

  11. ==============================

    11.플랫 파일 시스템 (사용 관점에서 Atleast)을 사용하는 방법이 있습니다.

    플랫 파일 시스템 (사용 관점에서 Atleast)을 사용하는 방법이 있습니다.

    이 Google App Engine 가상 파일 시스템 프로젝트가 있습니다. 이는 일반적인 파일 시스템을 에뮬레이트하기 위해 datastore 및 memcache API를 사용하여 구현됩니다. 이 라이브러리를 사용하면 유사한 파일 시스템 액세스 (읽기 및 쓰기)를 프로젝트에서 사용할 수 있습니다.

  12. from https://stackoverflow.com/questions/81451/upload-files-in-google-app-engine by cc-by-sa and MIT license