Příklad nahrávání a stahování souborů v servletu

Příklad nahrávání a stahování souborů v servletu

Úvod

Servlety jsou nezbytnou součástí webových aplikací Java EE, které umožňují dynamické zpracování požadavků HTTP a generování odpovědí. Jedním z běžných úkolů, které servlety musí zpracovávat, je nahrávání a stahování souborů. V tomto článku probereme, jak implementovat nahrávání a stahování souborů v servletu s praktickým příkladem.

Nahrávání souborů

1. Konfigurace formuláře HTML

Pro zahájení nahrávání souboru musíme vytvořit formulář HTML, který obsahuje prvek <input type="file">. Tento prvek umožní uživatelům vybrat soubor z jejich místního systému. Následující úryvek kódu ukazuje jednoduchý formulář pro nahrávání souboru:


<form action="UploadServlet" method="POST" enctype="multipart/form-data">
<input type="file" name="soubor">
<input type="submit" value="Nahrát">
</form>

2. Vytvoření servlety pro nahrávání

Po odeslání formuláře bude požadavek HTTP odeslán na servlet, který bude zpracovávat nahrávání souboru. V servletu musíme nejprve získat referenci na část<input type="file"> pomocí request.getPart()a uložit soubor do systému souborů.

java
// Importy
import java.io.IOException;
import java.io.InputStream;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import javax.servlet.ServletException;
import javax.servlet.annotation.MultipartConfig;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@WebServlet("/UploadServlet")
@MultipartConfig
public class UploadServlet extends HttpServlet {

@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// Získání části souboru
Part filePart = request.getPart("soubor");
String fileName = filePart.getSubmittedFileName();

// Kontrola, zda byl vybrán soubor
if (fileName != null && !fileName.isEmpty()) {
// Získání cesty k souboru
Path uploadPath = Paths.get("C:\\uploads\\" + fileName);

// Získání vstupního streamu pro soubor
InputStream fileContent = filePart.getInputStream();

// Uložení souboru do systému souborů
Files.copy(fileContent, uploadPath);

// Přesměrování zpět na počáteční stránku
response.sendRedirect("index.jsp");
} else {
// Nevybrán žádný soubor, zobrazení chybové zprávy
response.getWriter().write("Nevybrán žádný soubor ke nahrání.");
}
}
}

Stahování souborů

1. Poskytnutí odkazu ke stažení

Pro stažení souboru musíme poskytnout odkaz, který odkazuje na soubor na serveru. Odkaz může být generován pomocí technologie Servlet nebo může být pevně zakódován v HTML. Následující úryvek kódu ukazuje jednoduchý odkaz ke stažení:


<a href="DownloadServlet?file=soubor.pdf">Stáhnout soubor</a>

2. Vytvoření servlety pro stahování

Po kliknutí na odkaz ke stažení bude požadavek HTTP odeslán na servlet, který bude zpracovávat stahování souboru. V servletu musíme získat referenci na soubor v systému souborů a odeslat soubor klientovi s příslušnými hlavičkami HTTP.

java
// Importy
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.OutputStream;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@WebServlet("/DownloadServlet")
public class DownloadServlet extends HttpServlet {

@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// Získání názvu souboru z parametru požadavku
String fileName = request.getParameter("file");

// Kontrola, zda byl zadán soubor
if (fileName != null && !fileName.isEmpty()) {
// Získání cesty k souboru
File downloadFile = new File("C:\\downloads\\" + fileName);

// Kontrola, zda soubor existuje
if (downloadFile.exists()) {
// Nastavení typu obsahu odpovědi
response.setContentType("application/octet-stream");

// Nastavení hlavičky odpovědi pro připojení
response.setHeader("Content-Disposition", "attachment; filename=" + fileName);

// Získání výstupního streamu pro odpověď
OutputStream out = response.getOutputStream();

// Získání vstupního streamu pro stahovaný soubor
FileInputStream in = new FileInputStream(downloadFile);

// Kopírování obsahu souboru do výstupního streamu
byte[] buffer = new byte[4096];
int length;
while ((length = in.read(buffer)) > 0) {
out.write(buffer, 0, length);
}

// Zavření vstupního a výstupního streamu
in.close();
out.close();
} else {
// Soubor neexistuje, zobrazení chybové zprávy
response.getWriter().write("Požadovaný soubor neexistuje.");
}
} else {
// Nezadán soubor, zobrazení chybové zprávy
response.getWriter().write("Nezadán žádný soubor ke stažení.");
}
}
}

Závěr

Nahrávání a stahování souborů je běžnou úlohou ve webových aplikacích Java EE a serlety poskytují jednoduchý a efektivní způsob, jak toho dosáhnout. Pomocí technik popsaných v tomto článku můžete snadno implementovat nahrávání a stahování souborů ve svých vlastních servletových aplikacích.

Časté dotazy (FAQ)

1. Jaký je limit velikosti souboru pro nahrávání?
Odpověď: Limit velikosti souboru je konfigurován v anotaci @MultipartConfig.

2. Jak mohu uložit soubory do databáze místo systému souborů?
Odpověď: K uložení souborů do databáze použijte knihovnu ORM, jako je Hibernate.

3. Jak mohu chránit soubory před neoprávněným přístupem?
Odpověď: K ochraně souborů před neoprávněným přístupem použijte zabezpečení na úrovni souborů nebo šifrování.

4. Jak mohu sledovat průběh nahrávání souboru?
Odpověď: K monitorování průběhu nahrávání použijte rozhraní ServletProgressListener.

5. Jak mohu povolit vícenásobné nahrávání souborů?
Odpověď: V anotaci @MultipartConfig nastavte maxFileSize a maxRequestSize na -1.

6. Jak mohu omezit typy souborů, které lze nahrát?
Odpověď: V poznámce @MultipartConfig použijte fileExtensions nebo fileSizeThreshold.

7. Jak mohu nastavit vypršení platnosti odkazu ke stažení?
Odpověď: Nastavte hlavičku Cache-Control v servletu pro stahování.

8. Jak mohu zabránit útokům přímého odkazu?
Odpověď: Použijte tokeny s časovým omezením nebo digitální podpisy, abyste zabránili neoprávněnému přístupu ke souborům.

  Upravujte videa rychleji na Chromebooku pomocí těchto 7 softwaru