Heim  >  Artikel  >  Java  >  Wie kopiere ich eine lokale Datei in eine Netzwerkdatei und lade sie mit Java hoch?

Wie kopiere ich eine lokale Datei in eine Netzwerkdatei und lade sie mit Java hoch?

WBOY
WBOYnach vorne
2023-04-25 15:49:081467Durchsuche

    Dateikopie

    Dateikopie: Kopieren Sie eine lokale Datei von einem Verzeichnis in ein anderes. (Über das lokale Dateisystem)

    Hauptcode
    package dragon;
    
    import java.io.BufferedInputStream;
    import java.io.BufferedOutputStream;
    import java.io.File;
    import java.io.FileInputStream;
    import java.io.FileNotFoundException;
    import java.io.FileOutputStream;
    import java.io.IOException;
    
    /**
     * 本地文件复制:
     * 将文件从一个地方复制到另一个地方。
     * 
     * @author Alfred
     * */
    public class FileCopy {
    	
    	public FileCopy() {}
    	
    	public void fileCopy(String target, String output) throws IOException {
    		File targetFile = new File(target);
    		File outputPath = new File(output);
    		
    		this.init(targetFile, outputPath);
    		
    		/**注意这里使用了 try with resource 语句,所以不需要显示的关闭流了。
    		 * 而且,再关闭流操作中,会自动调用 flush 方法,如果不放心,
    		 * 可以在每个write 方法后面,强制刷新一下。
    		 * */
    		try (
    			BufferedInputStream bis = new BufferedInputStream(new FileInputStream(targetFile));                //创建输出文件
    			BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(new File(outputPath, "copy"+targetFile.getName())))){
    			int hasRead = 0;
    			byte[] b = new byte[1024];
    			while ((hasRead = bis.read(b)) != -1) {
    				bos.write(b, 0, hasRead);
    			}
    		}
    		System.out.println("文件复制成功");
    	}
    	
    	//数据校验及初始化工作
    	private void init(File targetFile, File outputPath) throws FileNotFoundException {
    		if (!targetFile.exists()) {
    			throw new FileNotFoundException("目标文件不存在:"+targetFile.getAbsolutePath());
    		} else {
    			if (!targetFile.isFile()) {
    				throw new FileNotFoundException("目标文件是一个目录:"+targetFile.getAbsolutePath());
    			}
    		}	
    		
    		if (!outputPath.exists()) {
    			if (!outputPath.mkdirs()) {   
    				throw new FileNotFoundException("无法创建输出路径:"+outputPath.getAbsolutePath());
    			}
    		} else {
    			if (!outputPath.isDirectory()) {
    				throw new FileNotFoundException("输出路径不是一个目录:"+outputPath.getAbsolutePath());
    			}
    		}
    	}
    }
    Testklasse
    package dragon;
    
    import java.io.IOException;
    
    public class FileCopyTest {
    	public static void main(String[] args) throws IOException {
    		String target = "D:/DB/BuilderPattern.png";
    		String output = "D:/DBC/dragon/";
    		FileCopy copy = new FileCopy();
    		copy.fileCopy(target, output);
    	}
    }
    Ausführungsergebnisse

    Hinweis:Die Datei rechts ist das Ergebnis des Kopierens, die Datei links nicht. (unten erwähnt!)

    Wie kopiere ich eine lokale Datei in eine Netzwerkdatei und lade sie mit Java hoch?

    Erläuterung

    Der obige Code kopiert lediglich eine lokale Datei von einem Verzeichnis in ein anderes. Dies ist nur ein Prinzipcode zur Veranschaulichung der Eingabe-Ausgabe-Stream-Anwendungen. Kopieren Sie Dateien von einem Ort zum anderen.

    Network File Transfer (TCP)

    **Network File Transfer (TCP): **Mithilfe von Sockets (TCP) zur Demonstration werden Dateien von einem Ort zum anderen kopiert. (Über das Netzwerk.)

    Hauptcode

    Server

    import java.io.BufferedInputStream;
    import java.io.BufferedOutputStream;
    import java.io.BufferedReader;
    import java.io.File;
    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.io.InputStreamReader;
    import java.net.ServerSocket;
    import java.net.Socket;
    
    public class Server {
    	public static void main(String[] args) throws IOException {
    		try (
    			ServerSocket server = new ServerSocket(8080)){
    			Socket client = server.accept();			
    			//开始读取文件
    			try (
    				BufferedInputStream bis = new BufferedInputStream(client.getInputStream());
    				BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(new File("D:/DBC/dragon", System.currentTimeMillis()+".jpg")))){
    				int hasRead = 0;
    				byte[] b = new byte[1024];
    				while ((hasRead = bis.read(b)) != -1) {
    					bos.write(b, 0, hasRead);
    				}
    			}
    			System.out.println("文件上传成功。");
    		}
    	}
    }

    Client

    import java.io.BufferedInputStream;
    import java.io.BufferedOutputStream;
    import java.io.BufferedWriter;
    import java.io.File;
    import java.io.FileInputStream;
    import java.io.IOException;
    import java.io.OutputStreamWriter;
    import java.net.Socket;
    import java.net.UnknownHostException;
    
    public class Client {
    	public static void main(String[] args) throws UnknownHostException, IOException {
    		try (Socket client = new Socket("127.0.0.1", 8080)){
    			File file = new File("D:/DB/netFile/001.jpg");	
    			//开始写入文件
    			try (
    				BufferedInputStream bis = new BufferedInputStream(new FileInputStream(file));
    				BufferedOutputStream bos = new BufferedOutputStream(client.getOutputStream())){
    				int hasRead = 0;
    				byte[] b = new byte[1024];
    				while ((hasRead = bis.read(b)) != -1) {
    					bos.write(b, 0, hasRead);
    				}
    			}
    		}
    	}
    }
    Ausführungseffekt

    Ausführungsprogramm

    Wie kopiere ich eine lokale Datei in eine Netzwerkdatei und lade sie mit Java hoch?

    Hinweis: Das Verzeichnis und der lokale Bereich von die hochgeladene Datei. Die Dateien werden in dasselbe Verzeichnis kopiert, jedoch auf unterschiedliche Weise. Die Dateien werden unterschiedlich benannt und es wird die aktuelle Anzahl von Millisekunden verwendet. Datei vor dem Kopieren Hier sind Kenntnisse erforderlich, es handelt sich jedoch um die grundlegendsten Kenntnisse. Es ist ersichtlich, dass die oben genannten serverseitigen und clientseitigen Codes sehr einfach sind und nicht einmal den Suffixnamen der übertragenen Datei implementieren! (Haha, eigentlich kenne ich mich mit der Socket-Programmierung nicht so gut aus. Ich habe zuerst versucht, den Dateinamen zu übertragen, was aber fehlgeschlagen ist. Dies hat jedoch keinen Einfluss auf dieses Beispiel. Ich werde mir die Zeit nehmen, mir Sockets anzuschauen. Ha!) Beachten Sie was Ich meine hier Kopieren Sie Dateien über das Netzwerk von einem Ort zum anderen. (Das Transportschichtprotokoll wird häufiger verwendet)

    Wie kopiere ich eine lokale Datei in eine Netzwerkdatei und lade sie mit Java hoch?Netzwerkdateiübertragung (HTTP)

    HTTP ist ein Anwendungsschichtprotokoll, das auf dem TCP/IP-Protokoll aufbaut. Die Verwendung des Transportschichtprotokolls ist noch schwieriger und nicht so Gut als Anwendungsschicht. Das Protokoll ist einfach zu verwenden.

    Netzwerk-Dateiübertragung (HTTP):

    Hier verwenden wir als Beispiel die Servlet-Technologie (3.0 oder höher) (JSP) und nehmen unseren am häufigsten verwendeten Datei-Upload als Beispiel. Wie kopiere ich eine lokale Datei in eine Netzwerkdatei und lade sie mit Java hoch?

    Kopieren Sie Dateien mithilfe des HTTP-Protokolls von einem Ort zum anderen.

    Verwenden Sie Apache-Komponenten, um den Datei-Upload zu implementieren

    Hinweis: Da der ursprüngliche Datei-Upload über Servlet problematischer war, werden jetzt einige Komponenten verwendet, um diese Datei-Upload-Funktion zu erreichen. (Ich habe nicht den originellsten Weg gefunden, den Datei-Upload zu schreiben. Das muss sehr umständlich sein!) Hier werden zwei JAR-Pakete verwendet:

    commons-fileupload-1.4.jar

    commons-io -2.6 .jar

    Hinweis:

    kann von der Apache-Website heruntergeladen werden.

    • Das Servlet, das Dateien hochlädt

      package com.study;
      
      import java.io.File;
      import java.io.IOException;
      import java.util.Iterator;
      import java.util.List;
      import javax.servlet.ServletException;
      import javax.servlet.annotation.WebServlet;
      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.FileItemFactory;
      import org.apache.commons.fileupload.disk.DiskFileItemFactory;
      import org.apache.commons.fileupload.servlet.ServletFileUpload;
      
      /**
       * Servlet implementation class UploadServlet
       */
      @WebServlet("/UploadServlet")
      public class UploadServlet extends HttpServlet {
      	private static final long serialVersionUID = 1L;
      
      	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
      		//如果不是文件上传的话,直接不处理,这样比较省事
      		if (ServletFileUpload.isMultipartContent(request)) {
      			//获取(或者创建)上传文件的路径
      			String path = request.getServletContext().getRealPath("/image");
      			File uploadPath = new File(path);
      			if (!uploadPath.exists()) {
      				uploadPath.mkdir();
      			}
      			
      			FileItemFactory factory = new DiskFileItemFactory();
      			ServletFileUpload upload = new ServletFileUpload(factory);
      			List<FileItem> items;
      			try {
      				items = upload.parseRequest(request);
      				Iterator<FileItem> it = items.iterator();
      				while (it.hasNext()) {
      					FileItem item = it.next();
      					//处理上传文件
      					if (!item.isFormField()) {
      						String filename = new File(item.getName()).getName();
      						System.out.println(filename);
      						File file = new File(uploadPath, filename);
      						item.write(file);
      						response.sendRedirect("success.jsp");
      					}
      				}
      			} catch (Exception e) {
      				e.printStackTrace();
      			}
      		}
      	}
      }

    • In der JSP, die Dateien hochlädt, ist nur ein Formular erforderlich.
    • <h2>文件上传</h2>
      <form action="NewUpload" method="post"  enctype="multipart/form-data">
          <input type="file" name="image">
          <input type="submit" value="上传">
      </form>
      Betriebseffekt

    • Erklärung

    Obwohl diese Verarbeitung zum Hochladen von Dateien geeignet ist, da sie relativ ausgereifte Technologien verwendet, ist sie für diejenigen von uns, die die Eingabe- und Ausgabeströme verstehen möchten, nicht so gut. In diesem Beispiel können Sie die Verwendung von Eingabe- und Ausgabeströmen grundsätzlich nicht erkennen, sie sind alle gekapselt.

    Verwendung der neuen Technologie nach Servlet 3.0 zum Implementieren des Datei-Uploads

    package com.study;
    
    import java.io.BufferedInputStream;
    import java.io.BufferedOutputStream;
    import java.io.File;
    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.util.UUID;
    
    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;
    import javax.servlet.http.Part;
    
    /**
     * Servlet implementation class FileUpload
     */
    @MultipartConfig
    @WebServlet("/FileUpload")
    public class FileUpload extends HttpServlet {
    	private static final long serialVersionUID = 1L;
    	
    	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    		Part part = request.getPart("image");
    		String header = part.getHeader("Content-Disposition");
    		System.out.println(header);
    		String filename = header.substring(header.lastIndexOf("filename=\"")+10, header.lastIndexOf("\""));
    		
    		String fileSuffix = filename.lastIndexOf(".") != -1 ? filename.substring(filename.lastIndexOf(".")) : "";
    		String uploadPath = request.getServletContext().getRealPath("/image");
    		File path = new File(uploadPath);
    		if (!path.exists()) {
    			path.mkdir();
    		}
    		
    		filename = UUID.randomUUID()+fileSuffix;
    		try (
    			BufferedInputStream bis = new BufferedInputStream(part.getInputStream());
    			BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(new File(path, filename)))){
    			int hasRead = 0;
    			byte[] b = new byte[1024];
    			while ((hasRead = bis.read(b)) != -1) {
    				bos.write(b, 0, hasRead);
    			}
    		}
    		response.sendRedirect("success.jsp");
    	}
    
    	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    		doGet(request, response);
    	}
    
    }
    Unter Verwendung der neuen Funktionen von Servlet 3.0 wird hier die -Annotation verwendet. (Wenn Sie diese Annotation nicht verwenden, funktioniert sie nicht richtig! Wenn Sie interessiert sind, können Sie mehr erfahren.)

    Hinweis: Im folgenden Code gehe ich hier zu weit, aber das ist genau das, was ich will um zu sehen. Es handelt sich auch um einen Eingabe- und Ausgabestream. Achten Sie darauf, dies mit den obigen Beispielen zu vergleichen.

    try (
    	BufferedInputStream bis = new BufferedInputStream(part.getInputStream());
    		BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(new File(path, filename)))){
    		int hasRead = 0;
    		byte[] b = new byte[1024];
    		while ((hasRead = bis.read(b)) != -1) {
    			bos.write(b, 0, hasRead);
    		}
    	}

    Der einfachere Weg ohne die Verwendung der Apache-Komponente ist der folgende:

    package com.study;
    
    import java.io.File;
    import java.io.IOException;
    import java.util.UUID;
    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;
    import javax.servlet.http.Part;
    
    /**
     * Servlet implementation class NewUpload
     */
    @MultipartConfig
    @WebServlet("/NewUpload")
    public class NewUpload extends HttpServlet {
    	private static final long serialVersionUID = 1L;
    
    	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    		Part part = request.getPart("image");
    		String header = part.getHeader("Content-Disposition");
    		System.out.println(header);
    		String filename = header.substring(header.lastIndexOf("filename=\"")+10, header.lastIndexOf("\""));
    		String fileSuffix = filename.lastIndexOf(".") != -1 ? filename.substring(filename.lastIndexOf(".")) : "";
    		String uploadPath = request.getServletContext().getRealPath("/image");
    		File path = new File(uploadPath);
    		if (!path.exists()) {
    			path.mkdir();
    		}
    		filename = uploadPath+File.separator+System.currentTimeMillis()+UUID.randomUUID().toString()+fileSuffix;
    		part.write(filename);
    		response.sendRedirect("success.jsp");
    	}
    
    }

    Dies ist der einzige Schritt, der die Datei tatsächlich schreibt. Bei den vorherigen handelt es sich ausschließlich um Codes, die sich auf die Verarbeitung von Dateinamen und hochgeladenen Dateipfaden beziehen. Diese drei Methoden zur Verwendung von HTTP verfügen alle über Code, der Dateinamen und Upload-Dateipfade verarbeitet.

    如果通过这段代码,那就更看不出什么东西来了,只知道这样做,一个文件就会被写入相应的路径。

    part.write(filename);

    Das obige ist der detaillierte Inhalt vonWie kopiere ich eine lokale Datei in eine Netzwerkdatei und lade sie mit Java hoch?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

    Stellungnahme:
    Dieser Artikel ist reproduziert unter:yisu.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen