>  기사  >  Java  >  로컬 파일을 네트워크 파일에 복사하고 Java를 사용하여 업로드하는 방법은 무엇입니까?

로컬 파일을 네트워크 파일에 복사하고 Java를 사용하여 업로드하는 방법은 무엇입니까?

WBOY
WBOY앞으로
2023-04-25 15:49:081422검색

    파일 복사

    파일 복사: 한 디렉터리에서 다른 디렉터리로 로컬 파일을 복사합니다. (로컬 파일 시스템을 통해)

    메인 코드
    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());
    			}
    		}
    	}
    }
    테스트 클래스
    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);
    	}
    }
    실행 결과

    참고:오른쪽 파일은 복사한 결과이고, 왼쪽 파일은 복사한 결과가 아닙니다. (아래에 언급되어 있습니다!)

    로컬 파일을 네트워크 파일에 복사하고 Java를 사용하여 업로드하는 방법은 무엇입니까?

    설명

    위의 코드는 한 디렉터리에서 다른 디렉터리로 로컬 파일을 복사하는 것입니다. 이것은 입력 출력 스트림 응용 프로그램을 설명하는 기본 코드일 뿐입니다. 한 곳에서 다른 곳으로 파일을 복사하세요.

    네트워크 파일 전송(TCP)

    **네트워크 파일 전송(TCP): **시연을 위해 소켓(TCP)을 사용하면 파일이 한 위치에서 다른 위치로 복사됩니다. (네트워크를 통해.)

    Main code

    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);
    				}
    			}
    		}
    	}
    }
    실행 효과

    실행 프로그램

    로컬 파일을 네트워크 파일에 복사하고 Java를 사용하여 업로드하는 방법은 무엇입니까?

    참고: 디렉토리 및 지역 업로드된 파일 파일은 동일한 디렉터리에 복사되지만 방법은 다릅니다. 파일 이름은 다르게 지정되며 현재 시간(밀리초)이 사용됩니다. 복사 전 파일

    로컬 파일을 네트워크 파일에 복사하고 Java를 사용하여 업로드하는 방법은 무엇입니까?

    복사 후 파일

    로컬 파일을 네트워크 파일에 복사하고 Java를 사용하여 업로드하는 방법은 무엇입니까?

    지침

    네트워크를 통한 스트림 사용, 전송 레이어의 TCP 프로토콜 사용, 8080 포트 바인딩, 일부 네트워크는 여기에는 지식이 필요하지만 가장 기본적인 지식입니다. 위의 서버 측 코드와 클라이언트 측 코드는 매우 간단하며 전송된 파일의 접미사 이름도 구현하지 않는다는 것을 알 수 있습니다! (하하 사실 저는 소켓 프로그래밍에 대해 잘 알지 못합니다. 파일명 전송에 관해서는 처음에 시도했다가 실패했습니다. 하지만 이번 예제에는 영향을 미치지 않습니다. 시간을 내어 소켓을 살펴보겠습니다. ㅎ !) 여기서 의미하는 바를 참고하세요. 네트워크를 통해 한 곳에서 다른 곳으로 파일을 복사하세요. (가장 일반적으로 사용되는 프로토콜은 전송 계층 프로토콜입니다.)

    네트워크 파일 전송(HTTP)

    HTTP는 TCP/IP 프로토콜을 기반으로 구축된 응용 프로그램 계층 프로토콜로, 전송 계층 프로토콜은 사용하기가 더 까다롭습니다. 응용 프로그램 계층으로 적합합니다. 프로토콜은 사용하기 쉽습니다.

    네트워크 파일 전송(HTTP): 여기서는 가장 일반적으로 사용되는 파일 업로드를 예로 들어 Servlet(3.0 이상)(JSP) 기술을 사용합니다.

    HTTP 프로토콜을 사용하여 한 곳에서 다른 곳으로 파일을 복사합니다.

    apache 구성 요소를 사용하여 파일 업로드 구현

    참고: 서블릿을 통한 원본 파일 업로드가 더 까다롭기 때문에 이제 일부 구성 요소를 사용하여 이 파일 업로드 기능을 구현합니다. (파일 업로드를 작성하는 가장 독창적인 방법을 찾지 못했습니다. 매우 번거로울 것입니다!) 여기에는 두 개의 jar 패키지가 사용됩니다:

    • commons-fileupload-1.4.jar

    • commons-io -2.6 .jar

    참고: 아파치 웹사이트에서 다운로드할 수 있습니다.

    파일을 업로드하는 서블릿

    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();
    			}
    		}
    	}
    }

    파일을 업로드하는 jsp에서는 하나의 폼만 필요합니다.

    <h2>文件上传</h2>
    <form action="NewUpload" method="post"  enctype="multipart/form-data">
        <input type="file" name="image">
        <input type="submit" value="上传">
    </form>

    작동 효과

    설명

    이 처리는 파일 업로드에는 좋지만 상대적으로 성숙한 기술을 사용하기 때문에 입력 및 출력 스트림을 이해하려는 우리에게는 그다지 좋지 않습니다. 이 예에서는 기본적으로 입력 및 출력 스트림의 사용법을 볼 수 없으며 모두 캡슐화되어 있습니다.

    Servlet 3.0 이후의 새로운 기술을 사용하여 파일 업로드 구현

    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);
    	}
    
    }

    Servlet 3.0의 새로운 기능을 사용하여 @MultipartConfig 주석이 여기에 사용됩니다. (이 주석을 사용하지 않으면 제대로 작동하지 않습니다! 관심이 있으시면 자세히 알아볼 수 있습니다.)

    참고: 다음 코드에서는 너무 멀리 갔지만 이것이 바로 제가 원하는 것입니다. 보다. 이는 입력 및 출력 스트림이기도 합니다. 이를 위의 예와 비교해 보세요.

    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);
    		}
    	}

    아파치 컴포넌트를 사용하지 않는 가장 간단한 방법은 다음과 같습니다.

    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");
    	}
    
    }

    이것은 실제로 파일을 쓰는 유일한 단계입니다. 이전 코드는 모두 파일 이름 및 업로드된 파일 경로 처리와 관련된 코드입니다. HTTP를 사용하는 이 세 가지 방법에는 모두 파일 이름과 업로드된 파일 경로를 처리하는 코드가 있습니다.

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

    part.write(filename);

    위 내용은 로컬 파일을 네트워크 파일에 복사하고 Java를 사용하여 업로드하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

    성명:
    이 기사는 yisu.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제