2

ユーザーが画像をアップロードし、画像をディスクに保存してから Web ページに表示できるようにしようとしていますが、画像を正しく表示できません。これが私のものbin/app.pyです:

import web                                                                         

urls = (                                                                           
        '/hello', 'index'                                                          
        )                                                                          

app = web.application(urls, globals())                                             

render = web.template.render('templates/', base="layout")                          

class index:                                                                       
    def GET(self):                                                                 
        return render.hello_form()                                                 

    def POST(self):                                                                
        form = web.input(greet="Hello", name="Nobody", datafile={})                
        greeting = "%s, %s" % (form.greet, form.name)                                                                
        filedir = 'absolute/path/to/directory'
        filename = None                                                            
        if form.datafile:                                                     
            # replaces the windows-style slashes with linux ones.                  
            filepath = form.datafile.filename.replace('\\','/')                    
            # splits the and chooses the last part (the filename with extension)
            filename = filepath.split('/')[-1]                                     
            # creates the file where the uploaded file should be stored            
            fout = open(filedir +'/'+ filename,'w')                                
            # writes the uploaded file to the newly created file.                  
            fout.write(form.datafile.file.read())                                  
            # closes the file, upload complete.                                    
            fout.close()                                                           
            filename = filedir + "/" + filename                                    
        return render.index(greeting, filename)                                    

if __name__ == "__main__":                                                         
    app.run()     

そしてここにありますtemplates/index.html

$def with (greeting, datafile)                                                     

$if greeting:                                                                      
    I just wanted to say <em style="color: green; font-size: 2em;">$greeting</em>
$else:                                                                             
    <em>Hello</em>, world!                                                         
<br>                                                                               
$if datafile:                                                                      
    <img src=$datafile alt="your picture">                                         
<br>                                                                               
<a href="/hello">Go Back</a>  

これを行うと、画像のリンクが壊れます。画像を正しく表示するにはどうすればよいですか? 理想的には、ディスクから読み取って表示する必要はありませんが、それが可能かどうかはわかりません。また、ファイルを絶対パスではなく相対パスに書き込む方法はありますか?

4

2 に答える 2

1

URL にエントリを追加して、フォルダー内のすべての画像へのパスを挿入することもできます。

URL = ('/hello','Index',
       '/hello/image/(.*)','ImageDisplay'
      )
...
class ImageDisplay(object):
   def GET(self,fileName):
      imageBinary = open("/relative/path/from/YourApp}"+fileName,'rb').read()
      return imageBinary

../YourApp ではなく、./YourApp ではありません。プログラムがある場所から 1 つのディレクトリを検索します。これで、html で次のように使用できます。

<img src="/image/"+$datafile alt="your picture">

"imageBinary = open("{..." 行で使用するか、試してみることをお勧めします。

さらに情報が必要な場合はお知らせください。これは私の最初の応答です。

レスポンシブで質問して申し訳ありませんが、URL 定義の (.) の代わりに (.jpg) のような正規表現を使用する方法はありますか?

于 2014-12-03T04:02:55.383 に答える
0

web.py は、アプリケーションが実行されているディレクトリからすべてのファイルを自動的に提供するわけではありません。そうすると、だれでもアプリケーションのソース コードを読み取れる可能性があります。ただし、次のファイルを提供するディレクトリがありますstatic

他の質問に答えるには:はい、絶対パスの使用を避ける方法があります:相対パスを指定してください!

その後、コードは次のようになります。

filename = form.datafile.filename.replace('\\', '/').split('/')[-1]
# It might be a good idea to sanitize filename further.

# A with statement ensures that the file will be closed even if an exception is
# thrown.
with open(os.path.join('static', filename), 'wb') as f:
    # shutil.copyfileobj copies the file in chunks, so it will still work if the
    # file is too large to fit into memory
    shutil.copyfileobj(form.datafile.file, f)

行を省略してくださいfilename = filedir + "/" + filename。テンプレートに絶対パスを含める必要はありません。実際、含める必要はありません。を含める必要がありますstatic/。それ以上でもそれ以下でもありません:

<img src="static/$datafile" alt="your picture">
于 2013-07-02T04:28:56.990 に答える