運用イメージのサイズ変更の問題を解決する

サイトの画像の縮小コピーを表示する必要がある場合があります。 可能な解決策:



1.画像タグで、他のサイズを指定します。

<img src='/path/to/image.jpg' width: 100px height:150px>





明らかに、この場合、不必要なトラフィックが過剰にロードされています。 誰もが高速インターネットを持っているわけではなく、なんとなくばかげています。



2.プレースホルダーは独自にサイズ変更を行い、両方の画像をアップロードします。

非常に退屈な方法。 しかし、これがどこかで実践されていても驚かないでしょう。



3.管理部分では、写真がアップロードされると、サイズ変更が行われ、処理された画像が必要なフォルダー(xs、s、l、xl)に配置され、目的の写真が適切な場所に挿入されます。

ディメンションは常にタスクに適しているとは限りません-場合によってはn1に戻る必要があります。 (ただし、損失は少ない)



4.サイズとともに画像へのパスを記述します。 path/to/100x150/image.jpg



path/to/100x150/image.jpg



。 そのようなパスにnginxを設定し、画像がない場合は、サイズを変更して保存します。 (スクリプト)



このアプローチの欠点は、攻撃者がさまざまなパスを周期的に置換するスクリプトを作成することを決定した場合、サーバーに過度の負荷がかかることです。 必要に応じて、サーバーを配置するか、すべての空き容量を獲得できます



5. getImage(100,150,'image.jpg')



などのビューヘルパーをgetImage(100,150,'image.jpg')



ます。これは、イメージの存在を確認し、欠落している場合は、元のサイズを変更し、目的のパスを指定します。



このアプローチの欠点は、過剰なコードであり、元の画像が削除された場合、切り取られた画像はハードドライブに保存されたままになります



6.これは、私が見つけた問題を解決する方法だと思います。



 /tmp/ /origin/ /crop/100x150/ /crop/200x300/
      
      







origin-オリジナルのダウンロード画像を保存するためのフォルダー、

cropは、サイズ変更された画像のフォルダーが保存されるフォルダーです。

tmp-一時データのフォルダー



デーモンはオリジンフォルダーを調べ、その最後の変更の日付を保存されている日付と比較し、変更の日付が記憶している日付よりも遅い場合、デーモンは同期モードを開始します。



これを行うために、彼はクロップフォルダーを通過し、そこからフォルダーを引き出します。その名前は000x000と一致し、このフォルダーのファイルと元のファイル(名前のみ)を比較します。 トリミングされたものに過剰がある場合-欠落している場合は削除します-imagicを起動して変換します。 サイズはフォルダ名から取得します。

tmp/temp_file



は、最終変更タイムスタンプが保存されます。



この悪魔の実装例を紹介します。 pythonで書いた。 しかし、私はあなたがPythonに不慣れであることをすぐに警告するので、曲がった解決策が可能です。 私の意見では、言語を学ぶための最良の方法は、その上に良いプロジェクトを書くことです。 このデーモンはプロジェクトの一部です。 欠陥がある場合は、これを報告してください。 python-daemonパッケージは悪魔化に使用され、imagicをサーバーにインストールする必要があります。



 # -*- coding: utf-8 -*- import logging import time import os import re from daemon import runner from sets import Set _PATH = os.path.abspath(os.path.dirname(__file__)) LOG_PATH = os.path.abspath(os.path.join(_PATH, '../', 'files', 'logs')) PID_PATH = os.path.abspath(os.path.join(_PATH, '../', 'files', 'tmp')) class Azazel(): '''  ,    .     origin (   )          -    000x000    crop       add_sync_folders  origin_folder -   sync_folder    add_sync_folders -   pidfile_path -   pid  file_save_last_sync_data          LOG_PATH -     PID_PATH -   pid  ''' #    sync_folder = os.path.abspath( os.path.join(_PATH, '../', 'files', 'media', 'crop')) #      #   file_save_last_sync_data = PID_PATH + "/last_update" #    , #    origin_folder = os.path.abspath( os.path.join(_PATH, '../', 'files', 'media', 'origin')) # ,   #  add_sync_folders = [ os.path.abspath(os.path.join(_PATH, '../', 'files', 'tmp', '100x100')), ] pidfile_path = PID_PATH + '/azazel.pid' stdin_path = '/dev/null' stdout_path = '/dev/tty' stderr_path = '/dev/tty' pidfile_timeout = 5 def __init__(self): self.last_time_update = self.get_last_sync_date() def get_last_update_origin_folder(self): '''       ''' last_update = str(os.path.getmtime(self.origin_folder)) return last_update def set_last_update(self, time): '''       ''' #    self.last_time_update = time #    f = open(self.file_save_last_sync_data, 'w') f.write(str(time)) f.close() def get_last_sync_date(self): '''       ''' f = open(self.file_save_last_sync_data, 'r') last_sync = f.read() f.close() return last_sync def get_folders_to_sync(self): '''   ,   .    dir (   )    (-,    -  )         000x000 ''' folders = map( lambda folder_name: self.sync_folder + '/' + folder_name, os.listdir(self.sync_folder)) + self.add_sync_folders logger.info("folders list:" + str(folders)) return filter( lambda folder: re.match('^\d{,4}x\d{,4}$', folder.split('/')[-1]), folders) def folder_sync(self, folder): '''  .  ,             ,    -     ,     ''' logger.info("   :" + folder) #    folder_image_list = os.listdir(folder) #     origin_image_list    folder_image_list new_files = Set(self.origin_image_list) - Set(folder_image_list) logger.info("  :" + str(new_files)) #  for file_to_sync in new_files: #       size = folder.split('/')[-1] command = 'convert "%s" -resize %s "%s"' % ( self.origin_folder + '/' + file_to_sync, size, folder + '/' + file_to_sync, ) logger.info(command) result = os.system(command) logger.info(result) #     folder_image_list    origin_image_list delte_files = Set(folder_image_list) - Set(self.origin_image_list) logger.info(" :" + str(delte_files)) #  for file_to_sync in delte_files: logger.info('delete ' + folder + '/' + file_to_sync) os.remove(folder + '/' + file_to_sync) def sunc_folders(self): '''          ''' #      self.origin_image_list = os.listdir(self.origin_folder) #       for folder in self.get_folders_to_sync(): self.folder_sync(folder) def run(self): logger.info("start daemon azazel") self.sunc_folders() while True: last_update = self.get_last_update_origin_folder() if self.last_time_update < last_update: logger.info(" ") self.sunc_folders() self.set_last_update(last_update) time.sleep(10) daemon = Azazel() logger = logging.getLogger("DaemonLog") logger.setLevel(logging.DEBUG) formatter = logging.Formatter("%(asctime)s - %(name)s - %(levelname)s - %(message)s") handler = logging.FileHandler(LOG_PATH + "/azazel.log") handler.setFormatter(formatter) logger.addHandler(handler) daemon_runner = runner.DaemonRunner(daemon) daemon_runner.daemon_context.files_preserve = [handler.stream] daemon_runner.do_action()
      
      







-悪魔はうまく機能し、イデオロギー的な問題を除いて、問題を観察しませんでした-写真をあまり頻繁にアップロードしないと、なぜ悪魔が必要なのか、それを書き直したので、疑問が生じました コメントとディスカッションを考慮し、写真がアップロードされたときに開始される「セロリのタスク」として書きました。 どういうわけか、一般的な悪魔化は残ったが、別の計画にあった。



All Articles