문제

내 계획을 만들이 웹으로 사용하는 다운그레이드 visual studio 프로젝트 파일입니다.그러나,그것은 Google App Engine 지 파일을 업로드하고 평평한 파일에 저장하는 Google 서버를 통해 db.TextPropertydb.BlobProperty.

드리겠습니다 누군가를 제공할 수 있는 코드 샘플을(클라이언트와 서버쪽)에 어떻게 이 작업을 수행할 수 있습니다.

도움이 되었습니까?

해결책

여기에서 작동하는 전체 파일입니다.나는 원래에서 Google 사이트하고 수정하도록 그것을 약간 더다.

몇 가지 예:

  1. 이 코드를 사용하여 BlobStore API
  2. 의 목적을 이 라인에서 ServeHandler 클래스는"수정" 키 그래서 그것을 제거한 모든 이름 mangling 발생할 수 있는지에 브라우저(지 않았을 관찰서 크롬)

    blob_key = str(urllib.unquote(blob_key))
    
  3. 는"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('/')

이 스레드에서 Google 그룹은 그것에 대해:

파일 업로드

의 많은 유용한 코드는 토론이 나를 도와주에서 많은 업로드하는 파일이 있습니다.

구글은 발표 저장하기 위한 서비스 파일이 있습니다.보 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.모든 것을 가을 데이터 저장소 조금처럼 관계형 데이터베이스 그러하지 않습니다.

당신이 저장할 수 있는 파일로 TextPropertyBlobProperty 특성이 있습니다.

가 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 를 모방하는 일반 파일 시스템으로 넘어갑니다.이 라이브러리를 사용하여 사용할 수 있습에서 당신은 프로젝트 비슷한 파일시스템에 액세스(읽기 및 쓰기).

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top