サーバーへのファイルのバックグラウンドアップロード

GMailとHabrahabrの常連を使用するすべての人は、非アクティブな状態が数秒間続いた後に添付ファイルがサーバーにゆっくりダウンロードされ、ファイル名のフィールドがチェックボックスに置き換えられることに気付きました。

jQueryを使用して、1つのDjangoプロジェクトに同様の機能を実装しました。
ユーザーが名刺のロゴを選択すると、ロゴファイルがサーバーに透過的にダウンロードされ、処理されてからブラウザに「与えられ」ます。 ユーザーは、レイアウトでロゴが選択したものに変更されたことを確認します。

実装

ページをロードした後、 LoadLogotype()関数の定期的な呼び出しが開始されます。
var previous_logo = "";

// ------------------------------------------------ -----------------------------
関数LoadLogotype(){
var card_logo = $( "#card_logo")。val();
if((card_logo!= "")&&(previous_logo!= card_logo)){
previous_logo = card_logo;
$( "#uploadphoto")。submit();
}
}
// ------------------------------------------------ -----------------------------
$(関数(){
setInterval( "LoadLogotype()"、1000);
});

LoadLogotype()関数は、ロゴファイルが選択されているか、変更されているかを確認し、変更されている場合、uploadphotoフォームをサーバーに送信します。

フォームにはパラメーターtarget = "upload_frame"があります。つまり、別のページへの移行は開始されません。 すべての変更は、非表示のフレームのみに関係します。 このフレームでフォームを送信すると、サーバーから返された結果がロードされます。
...
form id = "uploadphoto" target = "upload_frame" enctype = "multipart / form-data" action = "/ upload_logo /" method = "post">
ロゴ:/フォーム>
...
iframe id = "upload_frame" name = "upload_frame" style = "display:none">
...

サーバーロゴのアップロード処理機能は、ユーザーフォルダーにファイルを保存します。 また、ダウンロードされたファイルは、allowed_filesリストに従ってチェックされます。これは、ユーザーによる無許可のファイルのダウンロードに対する保護です。
その結果、関数はファイルへのURLを提供します。
#------------------------------------------------- -----------------------------
def upload_logo(リクエスト):
「ロゴ画像のアップロードを処理する」

alloved_files =( '.jpg'、 '.jpeg'、 '.png'、 '.gif')

id = request.session ['our_id']
パス= settings.MEDIA_ROOT + 'uploads /%s /'%id
os.path.isdir(パス)でない場合:
試してください:
os.makedirs(パス)
を除く:
return "エラー:ファイルをアップロードするディレクトリを作成できませんでした!"
request.FILESのimage_fileの場合:
filename = request.FILES [image_file] ['filename']
名前、ext = os.path.splitext(ファイル名)
extがalloved_filesにない場合:
続ける
ファイル名== ''の場合:
続ける
コンテンツ= request.FILES [image_file] ['content']
f =オープン(パス+ファイル名、「w​​b」)
試してください:
f.write(コンテンツ)
最後に:
f.close()

内容= {
「画像」:「/ appmedia / uploads /%s /%s」%(id、filename)、
}
render_to_response( "done.html"、コンテンツ、context_instance = RequestContext(リクエスト))を返します

done.htmlテンプレートのレンダリング結果は、不可視のIFRAME "upload_frame"に分類されます 。 このスクリプトは、親ドキュメント内でcard_logotype要素を検出し、画像URLをサーバーから指定されたURLに置き換えます。
html>
頭>
スクリプト言語= "JavaScript"タイプ= "text / javascript">
parent.document.getElementById( 'card_logotype')。src = "{{image}}"
/スクリプト>
/頭>
ボディ>
/本体>
/ html>

その結果、ユーザーには選択した画像のロゴが変更されます。 ページ全体を更新することなく、プロセス全体が実行されます。 非表示フレームとロゴ画像の内容のみが変更されます。

ここでの仕組みをご覧ください: http : //bicards.pythondevside.com/

元の投稿

Source: https://habr.com/ru/post/J22838/


All Articles