※pom.xml
<dependency> <groupId>commons-fileupload</groupId> <artifactId>commons-fileupload</artifactId> <version>1.3.2</version> </dependency>
※上傳功能要用到這個jar,也可以到官方提供的demo檔copy
※如果沒給jar還是可以起,但要用到時,會報「java.lang.UnsupportedOperationException: File uploads not supported」錯誤
※.java
@Override
public String dealWith(FileTransfer ft) {
if (ft.getSize() != 0) {
System.out.println("filename=" + ft.getFilename());
System.out.println("mimeType=" + ft.getMimeType());
WebContext ctx = WebContextFactory.get();
System.out.println("contextPath=" + ctx.getContextPath());
System.out.println("realPath=" + ctx.getServletContext().getRealPath("/"));
try {
ft.getInputStream();
} catch (IOException e) {
e.printStackTrace();
}
return "success!";
}
return "fail!";
}
※可以利用getMimeType()控制上傳的型態
※WebContext可以取得ContextPath和ServletContext
※.jsp
function fileUpload(){
dao.dealWith(dwr.util.getValue('f'), {
callback : function(rtn){
dwr.util.setValue('sp', rtn);
}
});
}
----------
<input type="file" id="f" />
<input type="button" id="b" value="click me" onclick="fileUpload()" />
<span id="sp"></span>
※有進度條的上傳
要用到上一篇的activeReverseAjaxEnabled為true,所以web.xml要設定※.java
public String dealWith(FileTransfer ft) {
long size = ft.getSize();
if (size != 0) {
// 原始檔名
String oFileName = ft.getFilename();
// 隨機亂數 + 原始檔名
String fileName = UUID.randomUUID() + "-" + oFileName.substring(oFileName.lastIndexOf("\\") + 1);
// 檔案路徑
String filePath = WebContextFactory.get().getServletContext().getRealPath("/") + "upload_file"
+ File.separator + fileName;
// 建立檔案類別,順便產生必要的路徑
File file = new File(filePath);
if (!file.getParentFile().exists()) {
file.getParentFile().mkdirs();
}
Browser.withCurrentPage(new Runnable() {
@Override
public void run() {
try (
InputStream input = ft.getInputStream();
OutputStream output = new FileOutputStream(file)
) {
byte bArray[] = new byte[1024];
int len = 0;
// 目前長度
int currentLen = 0;
while ((len = input.read(bArray)) != -1) {
// 為了方便看進度條有在動,所以用sleep
Thread.sleep(50);
output.write(bArray, 0, len);
currentLen += len;
// 百分比
double precent = Math.ceil(currentLen / (double) size * 100);
ScriptSessions.addFunctionCall("xxx", size, currentLen, precent);
}
} catch (Exception e) {
e.printStackTrace();
}
}
});
return "success!";
}
return "fail!";
}
※addFunctionCall的xxx要對應到前端的function
※.jsp
dwr.engine.setActiveReverseAjax(true) ;
dwr.engine.setNotifyServerOnPageUnload(true) ;
function fileUpload(){
dao.dealWith(dwr.util.getValue('f'), {
callback : function(rtn){
dwr.util.setValue('sp', rtn);
}
});
}
function xxx(size , currlen , percent) {
document.getElementById("bar").style.width = percent + "%";
document.getElementById("bar").innerHTML = percent + "%";
// HTML5
// document.getElementById("progress").value = percent;
// document.getElementById("person").innerHTML = percent + "%";
document.getElementById("allLeng").innerHTML = currlen + " | " + size;
}
----------
<input type="file" id="f" />
<input type="button" id="b" value="click me" onclick="fileUpload()" />
<span id="sp"></span>
<div style="width: 352px; border: 1px solid black; height: 30px;">
<i id="bar" style="background: pink; float: left; height: 100%;"></i>
</div>
<!-- HTML5 -->
<!-- <div> -->
<!-- <progress max="100" value="0" id="progress"></progress> -->
<!-- <i id="person"></i> -->
<!-- </div> -->
<span id="allLeng"></span>
※註解的部分為HTML5才有的進度條標籤
沒有留言:
張貼留言