DSpace新增input-type——FileUpload篇
DSpace新增input-type目錄
- 安裝篇
- TextEditor篇
- FileUpload篇
- XMLMetadata篇
圖示前面也貼過了,使用上也跟TextEditor一樣,故這邊講述一下使用上的限制、建議修改方向以及目前已知的Bug。
限制一:必須勾選「文件由一個以上的 檔案所組成」
如果沒有勾選的話,在編輯metadata的階段會提示你要回去勾選。
這是偷懶的程式設計,希望可以改善。
因為我想說如果很多欄位都要上傳檔案,那麼限定只能上傳一個檔案一定會出問題。因此我只修改在允許多檔案上傳所使用到的程式碼,並沒有去考慮到不允許多檔案上傳時候的情況。
改善的方案有兩個:
方案一:預先勾選「文件由一個以上的 檔案所組成」
雖然我們可以簡單地修改[dspace-jspui-webapp]/submit/initial-questions.jsp來讓一開史的問題時就對這一項打勾,但我覺得應該是要修改DSpace內部的預設參數才對。
關於多檔案上傳的設定,在之前的修改當中在edit-metadata.jsp有段程式碼可以略知一二:
boolean hasMultipleFiles = si.getSubmissionItem().hasMultipleFiles();
在回溯一連串的程式碼之後,會在[dspace-api]/workflow\WorkflowItem.java裡面看到hasMultipleFiles()其實是去取得"multiple_files"欄位的值。如果能將這個欄位的預設值改成true,應該會比起只改initial-questions.jsp還保留了些靈活性。
方案二:調整fileupload程式,依照判斷是否能夠上傳一個以上的檔案。
比起前者,這挑戰較為困難,但卻是比較好的解決方案。
大致上的規劃是:
- 先取得「已經上傳檔案」跟「是否只能上傳多個檔案」變數
- 如果「已經有上傳檔案」而且「不能上傳多個檔案」,則隱藏fileupload表單並提示訊息,否則顯示全部的fileupload表單。
- 上傳之後,如果是「不能上傳多個檔案」,則隱藏其他的fileupload表單,並顯示提示訊息。
- 刪除檔案的時候,如果是「不能上傳多個檔案」,則顯示其他fileupload表單。
如果我有時間的話,我會朝向這個方向去改善fileupload。當然如果有人能自己這樣改寫的話是最好的了!
限制二:一定要經過上傳階段。
如果把上傳階段放在敘述階段後面,那麼上傳檔案通常會失敗。但如果把上傳階段放在敘述階段前面,使用者又會對這個上傳階段不知道該傳些什麼好感到困惑。而且上面的ProcessBar有著上傳、驗證階段也有上傳的部份,都一樣會讓使用者感到困惑。
要修正這個問題有幾個方案:
方案一:將上傳階段放在step=2,並隱藏上傳階段。
建議修改的部份有:
- 上傳階段用JavaScript跳過(還要考慮上一步、下一步的影響)
- [dspace-jspui-webapp]/submit/progressbar.jsp隱藏上傳的階段
- [dspace-jspui-webapp]/submit/verify-prune.jspu隱藏上傳檔案的訊息。
但這些修改會大大地影響DSpace原來的遞交機制,我不是很贊成。
方案二:將上傳階段放在step=3,並在網址參數擁有「action=json」的情況下接受未到此步驟也能進行上傳。
這就要研究DSpace的遞交作業的結構去做修改,因為需要動到Java而重編譯,所以難度較高也較花時間,但我建議從此著手應該是比較好的。至於我也還沒研究到DSpace的遞交作業結構,所以無法建議可以修改的方向。
限制三:敘述階段跟上傳階段中檔案不同步的狀況。
在敘述階段當中,如果沒有按「下一步」、「上一步」或「取消儲存」按鈕做遞交(submit)的動作,就沒辦法把剛剛上傳檔案之後取得的資料儲存。因此如果上傳了檔案,卻沒有遞交而直接離開此畫面,就會造成上傳階段檔案列表裡面有該檔案、但描述階段卻沒有該檔案的情況。儘管這可以用JavaScript的事件onunload來避免使用者在未遞交的情況下離開網頁,但這對IE6似乎沒有效果,最後我只好作罷。
而如果在上傳階段刪去特定檔案的話,目前也不會同步刪除敘述階段裡面的資料。這可能還要對Submission做一番的研究才行。
遺憾的是,在熟悉Submission之前,我也想不到什麼有效的建議,要做到完全同不實在是很困難。最下策就是接受不同步的這個Bug,希望使用者能夠適應。當然,我並不樂見於此,因此希望有時間或有人能夠改善這個問題。
總體而言,FileUpload仍然不算完成,問題還是很多,目前也只有堪用的地步而已。
如果你有心繼續研究,請別忘了調整[dspace-jspui-webapp]/extension/ajaxfileupload/ajaxfileupload_fn.js裡面的參數。
繼續努力吧,下一篇終於要談到XMLMetadata了。