沒有依賴關係的簡單 Java 文件上傳器
已發表: 2023-01-06當代 Web 應用程序和網站的基本要求之一是能夠上傳文件,例如文檔、照片和視頻。 例如,用戶可以在 Instagram 等社交網絡平台上發布視頻和圖片。
實施和管理文件上傳程序以前是一項艱鉅的任務。 值得慶幸的是,由於在線技術的進步,文件上傳變得更加簡單。 例如, Java 文件上傳器使文件上傳快速方便。
但是,通過文件上傳,網絡犯罪分子可能會將惡意軟件或其他有害內容引入您的計算機並損壞服務器。 因此,開發人員必須絕對確保在其網站或 Web 應用程序上上傳的文件是安全的。 要建立安全的文件上傳,我們建議您使用可靠的 Java 文件上傳 SDK。
我們將在本文中介紹如何使用 Java 構建文件上傳器。
如何使用Java實現文件上傳器?
文件上傳器只不過是一個“提交”,用戶可以單擊它來將文件上傳到 Web 應用程序或網站。 然而,文件上傳器對開發人員的意義要大得多。
我們可以創建一個簡單的文件上傳器,其中我們只使用一個 HTML 表單和一個 servlet。 在我們的示例中,HTML 表單將有兩個輸入字段。 第一個輸入字段允許用戶上傳他的文件,第二個輸入字段允許開發人員告訴我們應該將文件存儲在哪裡。
我們正在使用 POST 方法將包括文件在內的表單數據發送到服務器。 另外,當我們上傳文件時,我們使用 encrypt=”multipart/form-data” 因為文件包含很多不可打印的字符。
servlet 管理 POST 請求並在處理傳入的文件數據後從流中提取文件。 目的地指定係統中必須保存文件的位置。 當我們按下上傳按鈕時,數據被傳輸到 servlet,然後將文件存儲在指定位置。
使用輸入字段創建 HTML 文件
在我們開始之前,先創建一個index.html文件以供後續操作。
index.html應具有以下代碼:
<!DOCTYPE html> <html lang=”en”> <頭> <title>Java 文件上傳器</title> <meta http-equiv=”Content-Type” content=”text/html; 字符集=UTF-8″> </頭> <正文> <form method=”POST” action=”upload” enctype=”multipart/form-data” > 文件: <input type=”file” name=”java-file” id=”java-file” /> <br/> 目的地: <input type=”text” value=”/java-folder” name=”destination”/> </br> <input type=”submit” value=”Submit” name=”submit” id=”submit” /> </表格> </body> </html> |
您的頁面應該如下所示:
處理文件的服務器端處理
要寫出 servlet 代碼,我們將創建一個名為 FileUploadServlet.java 的文件。 Serlets 使用註釋來定義組件和元數據。 所以@WebServlet 註解用於在 Java 中定義一個 servlet 組件。
Servlet 註釋應該說明應該為哪個 URL 執行哪個 HttpServlet。 為此,我們在 @WebServlet 註釋中定義了 name 和 ulrPattern 參數。 請注意,當我們提交表單時,我們將重定向到執行 FileUploadServlet 類的 /upload url。
@MultipartConfig 註釋通知 servlet 它將接收 MIME 類型的 multipart/form-data。
現在讓我們編寫完整的代碼。
@WebServlet(name = “FileUploadServlet” , urlPatterns = { “/upload” }) @MultipartConfig 公共類FileUploadServlet擴展HttpServlet { 私有最終靜態記錄器 LOGGER = Logger.getLogger(FileUploadServlet.class.getCanonicalName()); protected void processRequest(HttpServletRequest 請求, HttpServletResponse 響應) 拋出 ServletException,IOException { response.setContentType( “text/html;charset=UTF-8” ); final String dest= request.getParameter( “目的地” ); 最終部分 part = request.getPart( “file” ); final String nameOfFile = getFileName(部分); OutputStream out = null ; InputStream cont = null ; 最終 PrintWriter printWriter = response.getWriter(); 嘗試{ out = new FileOutputStream( new File(dest + File.separator + 文件名)); cont = part.getInputStream(); int 閱讀器 = 0 ; 最終字節[]字節=新字節[ 1024 ]; while ((reader = cont.read(bytes)) != -1 ) { out.write(bytes, 0 , reader); } printWriter.println( “文件” + nameOfFile + ” 創建於” + dest); LOGGER.log(Level.INFO, “文件{0}上傳到{1}” , 新對象[]{nameOfFile, dest}); }趕上(FileNotFoundException fne){ printWriter.println( “你沒有提到文件名或者是” + “試圖上傳一個文件到一個不存在的” + “位置。” ); printWriter.println( “<br/> 錯誤:” + fne.getMessage()); LOGGER.log(Level.SEVERE, “上傳文件時出錯。錯誤:{0}” , 新對象[]{fne.getMessage()}); }最後{ 如果(出!=空){ 關閉(); } 如果(續!=空){ 繼續關閉(); } 如果(printWriter!= null ){ printWriter.close(); } } } private String getFileName(最後一部分){ final String partHeader = part.getHeader( “content-disposition” ); LOGGER.log(Level.INFO, “Part Header = {0}” , partHeader); for (String content : part.getHeader( “content-disposition” ).split( “;” )) { 如果(content.trim().startsWith( “文件名” )) { 返回內容。子串( content.indexOf( '=' ) + 1 ).trim().replace( “\”” , “” ); } } 返回空值; } } |
processRequest方法在從請求中檢索到目標和文件部分後調用getFileName方法從文件部分獲取文件名。 之後,該方法創建一個FileOutputStream並將文件傳輸到所需位置。 該方法的錯誤處理部分檢測並解決了文件未找到錯誤的一些最常見原因。
部署代碼
現在我們必須構建並運行我們的程序。 為此,您可以使用任何您喜歡的 IDE,例如 NetBeans、Eclipse、Intellij Idea 等。完成後,部分轉到
https://cdn.pixabay.com/photo/2016/11/30/20/58/programming-1873854__340.png
如果您使用的是 NetBeans,請打開 Netbeans IDE 並導航到工作目錄。 如果遇到問題,請參閱 Java 的官方文檔。 在“項目”選項卡中右鍵單擊您的文件夾,然後選擇“部署”。 接下來,我們可以訪問瀏覽器並輸入以下 URL:
http://localhost:8080/{文件夾名}/
輸入 URL 並按回車鍵後,上面創建的 HTML 頁面將打開。 要將文件上傳到所需位置,我們可以搜索系統並選擇文件。 我們鍵入要在目標區域中存儲文件的文件夾的路徑。 該目錄必須是可寫的並且已經存在於系統中。 當我們單擊目標字段為空的上傳按鈕時,會引發異常。
當我們單擊上傳按鈕時,servlet 會收到一個 POST 請求,並將所選文件複製到指定文件夾。
我們可以訪問指定的文件夾,點擊上傳按鈕後查看加載的文件(例如TextFile.txt)是否存在。
到目前為止,我們使用 HTML 和 Java 構建了一個簡單的 Java 文件上傳器。 然而,隨著“簡單”成為具有許多功能的複雜上傳器,可能很難從那些不重要的功能中找出重要的功能。 更不用說,當我們考慮從頭開始構建上傳器時,還有幾個安全問題。 因此,下一節將帶您了解如何使用安全的 Filestack SDK 上傳文件。
如何使用 Filestack SDK 輕鬆上傳文件
要繼續,您將需要一個Filestack API 密鑰。
首先,使用以下命令安裝 Filestack SDK:
實施'com.filestack:filestack-java:0.9.0' |
要使用 Filestack 實現上傳功能,請在您的 Java 文件中使用以下代碼:
// 創建客戶端 配置配置=新配置( “API_KEY” ); Client client = new Client(配置); // 設置選項和上傳相關的元數據 StorageOptions 選項 = new StorageOptions.Builder() .mimeType( “文本/純文本” ) .filename( “文件.txt” ) 。建造(); // 執行同步上傳 FileLink files = client.upload( “/filepath” , false ); // 執行異步上傳 Flowable<Progress<FileLink>> upload = client.uploadAsync( “filepath” , false ); upload.doOnNext( new Consumer<Progress<FileLink>>() { @覆蓋 public void accept(Progress<FileLink> progress) throws Exception { System.out.printf( "%f%% 你的文件已上傳\n" , progress.getPercent()); 如果(progress.getData() != null ) { FileLink 文件 = progress.getData(); } } }); |
為確保其正常工作,可以運行以下測試:
./文件測試 |
如果您要部署您的應用程序,Bintray 是部署的目標。 要進行部署,您需要一個已在 Filestack 組織註冊的用戶帳戶。 還要遵守基本的 Filestack 發布指南。 需要環境變量“BINTRAY USER”和“BINTRAY API KEY”。 跑步:
導出BINTRAY_USER = ” 導出BINTRAY_API_KEY= ” ./文件 bintrayUpload |
結論
如果您發現難以維護和創建自己的 Java 文件上傳系統,您也可以選擇第三方工具。 出於數據安全和隱私方面的考慮,人們可能會避免使用第三方系統,例如在上傳保存醫療記錄的文件時。
此外,他們擔心他們幾乎無法控制誰有權訪問文件存儲基礎設施。 但是,您可以通過使用可靠的文件上傳解決方案來保證表格和文檔數據的安全。
常見問題 (FAQ)
可以使用 API 移動文件嗎?
是的。 使用 API 移動文件可以使用市場上可用的基於 API 的工具來完成。 這可以與在各種平台上運行的程序結合使用,例如在線程序。
我可以向 REST API 提交大文件嗎?
上傳大文件可能很困難,尤其是當存在帶寬和網絡連接不佳等其他因素時。 它可能會導致多次上傳失敗。
Java如何讀取上傳的文件?
使用輸入流,Java 程序讀取字節或字符的集合。 文件讀取是一個順序操作,從構造文件對像開始,將其傳遞給輸入文件,從流中讀取數據,進行處理,然後關閉流和文件對象。
什麼是文件上傳工具?
它是一個 API 或插件,可以連接到您的 Web 應用程序並允許用戶上傳照片、視頻和文本文件,以及允許一些基本的修改、濾鏡效果等。