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

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/



元の投稿



All Articles