論壇設計——多個使用者上傳檔案的後臺設計問題
阿新 • • 發佈:2019-01-04
功能描述:在設計論壇時使用者要發帖,使用者會向帖子中插入圖片,插入圖片的流程是:使用者先上傳圖片到伺服器,然後將伺服器中圖片的路徑新增到帖子中。那麼有一個問題,使用者會將要釋出的圖片上傳到伺服器的資料夾,然後將路徑放到帖子的內容中。論壇中有很多使用者,每個使用者都會發帖都會上傳各種檔案、圖片資源。那麼伺服器端如何儲存使用者上傳的檔案呢??就是如何設計檔案的儲存結構呢??
能想到的方法有倆種:
- 為每個使用者建立一個資料夾,資料夾中再進行分類,視訊,圖片,文件等。 這樣做的好處是,其他的使用者不能夠使用其他使用者上傳的圖片,結構比較清晰,管理起來比較方便。不好的是當用戶數量龐大時,建立的資料夾數目就會非常多,管理起來也並不方便。如果某個系統下限制資料夾的數目,這樣做的話就無法為相應的使用者建立資料夾,可能造成使用者操作失敗。
- 所有的使用者使用同一個資料夾,檔案下按照時間進行建資料夾。 這種情況下,可以使用年月日為資料夾目錄,再每個資料夾中進行檔案分類儲存,或則是先分類,再按照年月日建立資料夾都可以。這樣做的好處是避免了資料夾數量限制的短板,但是如果使用者數量大,上傳的檔案特別多,那麼某一天中資料夾的數量就會特別多,管理起來相當的不方便。
在自己的專案中,設計論壇模組的時候,希望實現的功能是每個使用者發帖的時候可以使用自己或別人上傳的圖片,但是隻能使用某天登入上傳的圖片。所以博主在設計資料夾目錄結構的時候,採用了第二種方法:先建立分類的資料夾,資料夾下面再採用年月日的方法建立資料夾。一年365天,加入某作業系統資料夾下允許建立36500個資料夾,那麼這個檔案系統再記憶體充足的情況下,可以使用100年,嗯嗯,差不多了。
在這個專案中,博主開發論壇使用的是百度的UEditor文字編輯器,在簡單的使用了這個編輯器之後,不得不感嘆這個編輯器的強大,使用起來超爽。下面博主就來講述一下自己是如何在專案種應用UEditor編輯器,並且使用該編輯器實現發帖【可以上傳圖片的功能的】。這裡直接寫如何實現的這些功能,不講解如何將編輯器植入到專案種,如果不明白,可以參看博主之前的那篇部落格,下面開始:
- 首先在發帖的jsp頁面中使用編輯器
用框圈住的是引入的文字編輯器,然後使用下面的js程式碼,使用工廠模式獲取一個編輯器。這樣就可以在相應的位置出現文字編輯器了。
- 簡答的設定編輯器可以使用的功能,在ueditor.config.js檔案中設定要顯示哪些功能。
- 很重要,配置編輯器的上傳功能,在UEditor-jsp-config.json檔案中進行配置,這裡以上傳圖片為例進行配置,其他的一樣。
最後的倆項配置圖片的訪問路徑,以及自定義的上傳儲存路徑
這裡列出的圖片目錄,是上傳到檔案的目錄
- 最後一項,需要配置自己的過濾器,因為專案是S2SH框架,使用的Struts2的核心過濾器,配置為
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
這樣的配置將所有的url請求全部攔截了,所以需要自定義一個過濾器並配置在核心過濾器之前。
package com.hebeu.xindian.action.fileOperation;
import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.struts2.dispatcher.StrutsRequestWrapper;
/**
* 自定義一個Filter,用來過濾controller.jsp請求
* @author acer
*
*/
@WebFilter("/UeditorFilter")
public class UeditorFilter implements Filter {
@Override
public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain)
throws IOException, ServletException {
HttpServletRequest request = (HttpServletRequest)req;
HttpServletResponse response = (HttpServletResponse)resp;
String url = request.getRequestURI();
if(decideURI(url)){
chain.doFilter(new StrutsRequestWrapper(request), resp);
}else{
chain.doFilter(req, resp);
}
}
@Override
public void init(FilterConfig filterConfig) throws ServletException {
// TODO Auto-generated method stub
}
@Override
public void destroy() {
// TODO Auto-generated method stub
}
private boolean decideURI(String url) {
if (url.endsWith("controller.jsp")) {
return true;
} else if (url.endsWith("fileUp.jsp")) {
return true;
}
return false;
}
}
部署
<filter-mapping>
<filter-name>ueditor</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
這樣便可以實現寫論壇並上傳檔案的功能。