Качване и изтегляне на JSP файл

⚡ Умно обобщение

Качването и изтеглянето на JSP файлове са основни операции за вход и изход, които позволяват на уеб приложението да получава файлове от потребители и да им ги предоставя обратно. Този ресурс обяснява и двата процеса, използвайки JSP формуляри за действие, Apache Commons FileUpload и класове на сървлети, с пълен работещ код.

  • 📤 Основи на качването: Използвайте POST метода и задайте enctype на multipart/form-data за всяко качване на файлове.
  • 🧩 Apache Commons: DiskFileItemFactory и ServletFileUpload разделят многокомпонентната заявка на файлови елементи.
  • 🗂️ Обработка на сървлети: Методът doPost итерира файлови елементи и записва всеки от тях в целева папка.
  • 📥 Процес на изтегляне: Сървлет предава файл, използвайки FileInputStream и заглавката Content-Disposition.
  • Конфигурация: Пътищата до файловете, ограниченията за размер и типът съдържание трябва да бъдат зададени преди четене или запис.

Качване и изтегляне на JSP файл

Качване на JSP файл

  • Можем да качваме всякакви файлове с помощта на JSP.
  • Това може да бъде текстов файл, двоичен файл, файл с изображение или друг документ.
  • Тук, в случай на качване на файл, ще се използва само методът POST, а не методът GET.
  • Атрибутът Enctype трябва да бъде зададен на multipart/form-data.

Пример: Използване на действие

В този пример качваме файл, използвайки IO обект.

Action_file.jsp

<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
    pageEncoding="ISO-8859-1"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Guru File</title>
</head>
<body>
<a>Guru File Upload:</a>
Select file: <br />
<form action="action_file_upload.jsp" method="post"
                        enctype="multipart/form-data">
<input type="file" name="file" size="50" />
<br />
<input type="submit" value="Upload File" />
</form>
</body>
</html>

Action_file_upload.jsp

<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
    pageEncoding="ISO-8859-1"%>
<%@ page import="java.io.*,java.util.*, javax.servlet.*" %>
<%@ page import="javax.servlet.http.*" %>
<%@ page import="org.apache.commons.fileupload.*" %>
<%@ page import="org.apache.commons.fileupload.disk.*" %>
<%@ page import="org.apache.commons.fileupload.servlet.*" %>
<%@ page import="org.apache.commons.io.output.*" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Guru File Upload</title>
</head>
<body>
<%
   File file ;
   int maxFileSize = 5000 * 1024;
   int maxMemSize = 5000 * 1024;
   String filePath = "E:/guru99/data";

   String contentType = request.getContentType();
   if ((contentType.indexOf("multipart/form-data") >= 0)) {

      DiskFileItemFactory factory = new DiskFileItemFactory();
      factory.setSizeThreshold(maxMemSize);
      factory.setRepository(new File("c:\\temp"));
      ServletFileUpload upload = new ServletFileUpload(factory);
      upload.setSizeMax( maxFileSize );
      try{
         List fileItems = upload.parseRequest(request);
         Iterator i = fileItems.iterator();
         out.println("<html>");
         out.println("<body>");
         while ( i.hasNext () )
         {
            FileItem fi = (FileItem)i.next();
            if ( !fi.isFormField () )  {
                String fieldName = fi.getFieldName();
                String fileName = fi.getName();
                boolean isInMemory = fi.isInMemory();
                long sizeInBytes = fi.getSize();
                file = new File( filePath + "yourFileName") ;
                fi.write( file ) ;
                out.println("Uploaded Filename: " + filePath + fileName + "<br>");
            }
         }
         out.println("</body>");
         out.println("</html>");
      }catch(Exception ex) {
         System.out.println(ex);
      }
   }else{
      out.println("<html>");
      out.println("<body>");
      out.println("<p>No file uploaded</p>");
      out.println("</body>");
      out.println("</html>");
   }
%>
</body>
</html>

Обяснение на кода:

Action_file.jsp

Code Ред 12-18: Тук създаваме формуляр с поле за файл, което ще качи файл на сървъра, а действието ще бъде предадено на action_file_upload.jsp.

Action_file_upload.jsp

Code Ред 20: Тук ние даваме пътя на файла до определен път.

Code Ред 23-38: Тук проверяваме дали типът съдържание е multipart/form-data. Ако случаят е такъв, тогава съдържанието е от файлов тип и се чете. След като файлът бъде прочетен, той се записва във временния файл, а след това временният файл се конвертира в основния файл.

Когато изпълните горния код, получавате следния изход:

Качване на JSP файл

Изход:

Качваме файл, използвайки опцията за избор на файл, а бутонът за качване на файл ще качи файла на сървъра по предоставения път.

Пример: Използване на JSP операции

В този пример ще качим файл, използвайки JSP операции. Ще вземем формуляр, който ще има бутон „качване“ и когато кликнете върху бутона за качване, файлът ще бъде качен.

Качване_1.jsp

<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
    pageEncoding="ISO-8859-1"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Guru Uploading File</title>
</head>
<body>
File: <br />
<form action="guru_upload" method="post"
                        enctype="multipart/form-data">
<input type="file" name="guru_file" size="50" />
<br />
<input type="submit" value="Upload" />
</form>
</body>
</html>

Обяснение на кода:

Code Ред 11-12: Тук вземаме формуляр, който има действие върху сървлета guru_upload, което ще премине през POST метод. Също така, тук атрибутът enctype определя как данните от формуляра трябва да бъдат кодирани и изпратени до сървъра и се използва само с POST метода. Тук го задаваме като multipart/form-data, което е за файла (тъй като данните ще бъдат големи).

Code Ред 13: Тук ние определяме елемента guru_file с тип file и даваме размера 50.

Code Ред 15: Това е бутон от тип „изпращане“ с името „Качване“, чрез който ще бъде извикан сървлетът за действие и заявката ще бъде обработена в него, а файлът ще бъде прочетен и записан в сървлета.

Guru_upload.java

package demotest;

import java.io.File;
import java.io.IOException;
import java.util.List;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;

public class guru_upload extends HttpServlet {
	private static final long serialVersionUID = 1L;

    public guru_upload() {
        super();
        // TODO Auto-generated constructor stub
    }
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		        if(ServletFileUpload.isMultipartContent(request)){
		            try {
		                List <FileItem> multiparts = new ServletFileUpload(new DiskFileItemFactory()).parseRequest(request);
		                for(FileItem item : multiparts){
		                    if(!item.isFormField()){
		                        String name = new File(item.getName()).getName();
		                        item.write( new File("c:/guru/upload" + File.separator + name));
		                    }
		                }
		               //File uploaded successfully
		               request.setAttribute("gurumessage", "File Uploaded Successfully");
		            } catch (Exception ex) {
		               request.setAttribute("gurumessage", "File Upload Failed due to " + ex);
		            }
		        }else{

		            request.setAttribute("gurumessage","No File found");
 }
		        request.getRequestDispatcher("/result.jsp").forward(request, response);

		    }


}

Обяснение на кода:

Code Ред 12-14: Тук ще трябва да импортираме библиотеката org.apache.commons в конфигурацията на кода. Ще трябва да импортираме класа fileupload от библиотеката org.apache.commons.

Code Ред 23: Тук имаме метода doPost(), който ще бъде извикан, когато предаваме POST метода в JSP, и ще приема обекти request и response като параметри.

Code Ред 26: Тук създаваме обект от класа ServletFileUpload от пакета fileUpload на библиотеката org.apache.commons, който ще провери дали има файлови обекти в JSP. Ако бъдат намерени такива, тези файлови обекти ще бъдат взети от заявката.

Code Ред 27-32: Ще итерираме върху броя на файловете, като проверим колко файлови елемента присъстват в обекта multiparts, който е обект тип списък (ако качваме повече от един файл), и ще го запишем в папката c:/guru/upload с предоставеното име на файла. Записваме файла, използвайки метода write на обекта file, в споменатата папка.

Code Ред 34: Ако няма изключение, тогава задаваме атрибут в заявката като gurumessage със стойност „Файлът е качен успешно“.

Code Ред 35-36: Ако възникне изключение, задаваме съобщение „Качването на файл неуспешно“.

Code Ред 40: Ако файлът не е намерен, задаваме съобщението като „Няма намерен файл“.

Code Ред 42: Препращане на заявката чрез обекта requestdispatcher към result.jsp с обекти request и response.

Result.jsp

<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
    pageEncoding="ISO-8859-1"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Guru Result</title>
</head>
<body>
<% String msg = (String)request.getAttribute("message");
   out.println(msg);
%>
</body>
</html>

Обяснение на кода:

Code Ред 10: Тук получаваме атрибута от обекта на заявката със стойност gurumessage в обект тип низ.

Code Ред 11: Тук отпечатваме това съобщение.

Когато изпълним горния код, получаваме следния изход:

Изход:

Получаваме формуляр, в който има полета за избор на файл от директорията. След като файлът е избран, трябва да кликнем върху бутона за качване.

Качване на файл с помощта на JSP операции

След като щракнете върху бутона за качване, получаваме съобщение, че файлът е качен успешно.

Качване на файл с помощта на JSP операции

На диаграмата по-долу можем да видим, че файлът е качен в папката c:/guru/upload.

Качване на файл с помощта на JSP операции

Изтегляне на JSP файл

В този пример ще изтеглим файл от директория, като щракнете върху бутона.

Изтегляне_1.jsp

<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
    pageEncoding="ISO-8859-1"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Downloading Guru Example</title>
</head>
<body>
Guru Downloading File<a href="guru_download">Download here!!!</a>
</body>
</html>

Обяснение на кода:

Code Ред 10: Тук сме дали линк за изтегляне на файл от папката c:/guru/upload, използвайки сървлета guru_download.

Guru_download.java

package demotest;

import java.io.FileInputStream;
import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * Servlet implementation class guru_download
 */
public class guru_download extends HttpServlet {
	private static final long serialVersionUID = 1L;

	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		response.setContentType("text/html");
		PrintWriter out = response.getWriter();
		String gurufile = "test.txt";
		String gurupath = "c:/guru/upload/";
		response.setContentType("APPLICATION/OCTET-STREAM");
		response.setHeader("Content-Disposition", "attachment; filename=\""
				+ gurufile + "\"");

		FileInputStream fileInputStream = new FileInputStream(gurupath
				+ gurufile);

		int i;
		while ((i = fileInputStream.read()) != -1) {
			out.write(i);
		}
		fileInputStream.close();
		out.close();
	}


	/**
	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
	}

}

Обяснение на кода:

Code Ред 3-5: Тук импортираме FileInputStream, IOException и Print.Writer от пакета java.io.

Code Ред 15: Дефинираме guru_download сървлет който разширява HttpServlet.

Code Ред 18: Както дефинирахме href, който ще бъде ограден в URL, така че методът GET ще бъде обработен (doGet ще бъде извикан в сървлета), който също така обхваща обекти за заявка и отговор.

Code Ред 19-20: Задаваме типа съдържание в обекта response и също така получаваме обекта writer от отговора.

Code Ред 21-22: Дефиниране на променлива като gurufile със стойност test.txt и gurupath като c:/guru/upload/.

Code Ред 23-25: Задаваме типа съдържание, използвайки обекта response, и използваме метода setHeader, който задава заглавката в обекта response като името на качения файл.

Code Ред 27-28: Създаваме FileInputStream, в който ще добавим gurupath+gurufile.

Code Ред 31-33: Тук сме взели a докато цикъл който ще се изпълнява, докато файлът бъде прочетен, следователно сме задали условието като != -1. В това условие записваме, използвайки обекта printwriter.

Когато изпълните горния код, ще получите следния изход:

Изход:

Файлът се изтегля

Трябва да кликнем върху downloading_1.jsp и ще получим хипервръзка „Изтеглете оттук“. Когато кликнете върху този файл с хипервръзка, той ще бъде изтеглен в системата.

Въпроси и Отговори

Да. AI асистентите могат да създават сервлети и JSP формуляри за качване и изтегляне на файлове, да добавят логика за качване на файлове на Apache Commons и да предлагат валидиране. Все пак трябва да тествате кода и да прегледате файловите пътища и ограниченията за размер.

Да. Скенерите, базирани на изкуствен интелект, могат да проверяват качените файлове за злонамерен софтуер, неочаквани типове или прекалено големи полезни товари, преди да достигнат до хранилището. Това добавя слой защита, въпреки че валидирането на типа и размера от страна на сървъра остава от съществено значение.

Кодирането multipart/form-data разделя заявката на части, така че данните от двоичния файл са transmitted непокътнат. Без него браузърът изпраща на сървъра само името на файла, а не действителното му съдържание.

Apache Commons FileUpload, заедно с Commons IO, е широко използван. Той анализира многокомпонентни заявки, предоставя всеки FileItem и записва каченото съдържание в избрана директория на сървъра.

Обобщете тази публикация с: