Lift を使用して画像をアップロードし、リロードせずにページの一部の要素にすぐに表示したいと考えています。このソリューション(PHPを使用)のようにやりたいです。
プロセスは比較的簡単です。PHP ファイルをダミーの HTML スニペットに置き換えました。
<form id="imageform" method="post" enctype="multipart/form-data" action="ajaximage.html">
<input id="imageFile" name="imageFile" type="file" size="50" maxlength="100000"/>
</form><br/>
<script src="jquery-1.8.3.min.js"></script>
<script src="jquery.form.js"></script>
<script type="text/javascript">
$(document).ready(function() {
$('#imageFile').live('change', function() {
$("#preview").html('');
$("#preview").html('<img src="images/processing.jpg" alt="Uploading...."/>');
$("#imageform").ajaxForm({
target : '#preview'
}).submit();
});
});
</script>
HTML スニペット:
<img src="images/someimage.jpg"/>
まあ、これはうまくいきます。しかし、明らかに動的な動作が必要です。サンプル ページでは、HTML スニペットの代わりに PHP ファイルを使用しています。このファイルは、リクエストからデータを抽出し、サーバーに保存し、それに応じてプレビュー イメージの HTML を出力します。echo "<img src='uploads/".$actual_image_name."' class='preview'>";
さて、リフトでこれを達成する方法がわかりません。
このディスカッションを見つけました: https://groups.google.com/forum/?fromgroups=#!topic/liftweb/6bxNlbBPJvEしかし、フレームワークと使用したくない HTML5 に関する漠然としたアドバイス以外に、良い解決策はありません。 .
パート 2。私は、Lift でこのためのいくつかの基本を既に実装しています。
HTML:
<div class="lift:AddImage.addEntry" form="POST" multipart="true">
<p><prefix:imageUpload/></p>
<p><prefix:test/></p>
</div>
スニペット:
package code
package snippet
import net.liftweb.http.S
import net.liftweb.common.Full
import net.liftweb.common.Empty
import net.liftweb.common.Box
import net.liftweb.http.FileParamHolder
import net.liftweb.util._
import Helpers._
import scala.xml.Group
import scala.xml.NodeSeq
import net.liftweb.http.SHtml
import javax.annotation.Resource
import java.io.OutputStream
import java.io.FileOutputStream
class AddImage {
// Add a variable to hold the FileParamHolder on submission
var fileHolder : Box[FileParamHolder] = Empty
def submitTest () {
println("submitTest called!")
val receiptOk = fileHolder match {
// An empty upload gets reported with a null mime type,
// so we need to handle this special case
case Full(FileParamHolder(_, null, _, _)) => true
case Full(FileParamHolder(_, mime, _, data)) =>
println("MIME: " + mime)
if (mime.startsWith("image/")) {
println("uploading the image: ")
//scala.io.Source.fromBytes(data)
try {
val out: OutputStream = new FileOutputStream("test.jpg");
out.write(data);
out.flush();
out.close();
} catch {
case e: Exception => println("Exception!: " + e)
}
true
}
case Full(_) => {
S.error("Invalid attachment")
false
}
case _ => true
}
// (e.validate, receiptOk) match {
// }
}
def addEntry(content: NodeSeq): NodeSeq = {
bind("prefix", content,
"imageUpload" -> SHtml.fileUpload(f => fileHolder = Box !! f),
"test" -> SHtml.submit("submitz", submitTest))
}
}
しかし、私はここで立ち往生しています:
Liftで作成したフォームをjqueryから参照する方法がわかりません。
JavaScript は、アップロード入力フィールドが変更されたときにフォームを送信し
ajaxForm()
、PHP スクリプトの結果を#preview
要素に挿入します。フォームをscalaで送信し、さらに画像HTMLを出力して、挿入できるようにする方法がわかりません#preview
これが多くの質問ではないことを願っています:)事前に感謝します。