Rumah  >  Artikel  >  Java  >  Bagaimana untuk menyalin fail tempatan ke fail rangkaian dan memuat naik menggunakan Java?

Bagaimana untuk menyalin fail tempatan ke fail rangkaian dan memuat naik menggunakan Java?

WBOY
WBOYke hadapan
2023-04-25 15:49:081466semak imbas

    Salinan fail

    Salinan fail: Salin fail setempat dari satu direktori ke satu lagi Jadual kandungan . (Melalui sistem fail tempatan)

    Kod utama
    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());
    			}
    		}
    	}
    }
    Kelas ujian
    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);
    	}
    }
    Hasil pelaksanaan

    Nota: Fail dihidupkan kanan ialah Hasil yang disalin, yang di sebelah kiri tidak. (disebut di bawah!)

    Bagaimana untuk menyalin fail tempatan ke fail rangkaian dan memuat naik menggunakan Java?

    Penjelasan

    Kod di atas hanya menyalin fail setempat dari satu direktori ke direktori yang lain. Ini hanyalah kod prinsip untuk menggambarkan aplikasi aliran input dan output. Salin fail dari satu tempat ke tempat lain.

    Pemindahan Fail Rangkaian (TCP)

    **Pemindahan Fail Rangkaian (TCP): ** Demonstrasi menggunakan soket (TCP), fail disalin dari satu tempat ke tempat lain. (Melalui rangkaian.)

    Kod Utama

    Pelayan

    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("文件上传成功。");
    		}
    	}
    }

    Pelanggan

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

    Program pelaksanaan

    Bagaimana untuk menyalin fail tempatan ke fail rangkaian dan memuat naik menggunakan Java?

    Nota: Direktori fail yang dimuat naik ini Ia berada dalam direktori yang sama dengan salinan fail tempatan, tetapi kaedah yang digunakan adalah berbeza Kaedah penamaan fail adalah berbeza, dan milisaat semasa digunakan. Fail sebelum menyalin

    Bagaimana untuk menyalin fail tempatan ke fail rangkaian dan memuat naik menggunakan Java?

    Fail selepas menyalin

    Bagaimana untuk menyalin fail tempatan ke fail rangkaian dan memuat naik menggunakan Java?

    Penjelasan

    Gunakan strim melalui rangkaian, gunakan protokol TCP lapisan pengangkutan dan ikat port 8080. Beberapa pengetahuan rangkaian diperlukan di sini, tetapi ia adalah pengetahuan yang paling asas. Ia boleh dilihat bahawa kod bahagian pelayan dan bahagian klien di atas adalah sangat mudah, dan mereka tidak melaksanakan nama akhiran fail yang dipindahkan! (Haha, sebenarnya saya tidak begitu biasa dengan pengaturcaraan soket. Saya cuba memindahkan nama fail pada mulanya, tetapi gagal. Namun, ini tidak menjejaskan contoh ini. Saya akan mengambil masa untuk melihat soket. Ha!) Perhatikan apa Maksud saya di sini salin fail dari satu tempat ke tempat lain melalui rangkaian. (Protokol lapisan pengangkutan yang paling biasa digunakan ialah protokol lapisan pengangkutan)

    Pemindahan fail rangkaian (HTTP)

    HTTP ialah protokol lapisan aplikasi yang dibina pada protokol TCP/IP, dan protokol lapisan pengangkutan menggunakan Nampaknya agak rumit dan tidak semudah digunakan sebagai protokol lapisan aplikasi.

    Pemindahan fail rangkaian (HTTP): Di sini kami menggunakan teknologi Servlet (3.0 atau lebih tinggi) (JSP) sebagai contoh, mengambil muat naik fail yang paling biasa kami gunakan sebagai contoh.

    Salin fail dari satu tempat ke tempat lain menggunakan protokol HTTP.

    Gunakan komponen apache untuk melaksanakan muat naik fail

    Nota: Oleh kerana muat naik fail asal melalui Servlet lebih menyusahkan, beberapa komponen kini digunakan untuk mencapai fungsi muat naik fail ini. (Saya tidak menemui cara paling asli untuk menulis muat naik fail. Ia mesti sangat menyusahkan!) Dua pakej balang digunakan di sini:

    • commons-fileupload-1.4. jar

    • commons-io-2.6.jar

    Nota: boleh dimuat turun dari laman web apache.

    Servlet yang memuat naik fail

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

    Dalam jsp yang memuat naik fail, hanya satu borang diperlukan.

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

    Kesan operasi

    Penjelasan

    Walaupun pemprosesan ini bagus untuk memuat naik fail, ia adalah kerana yang digunakan lebih banyak matang. Teknologi ini tidak begitu baik untuk kita yang ingin memahami aliran input dan output. Daripada contoh ini, anda pada dasarnya tidak dapat melihat penggunaan aliran input dan output, semuanya dirangkumkan.

    Menggunakan teknologi baharu selepas Servlet 3.0 untuk melaksanakan muat naik fail

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

    Menggunakan ciri baharu Servlet 3.0, anotasi @MultipartConfig digunakan di sini. (Jika anda tidak menggunakan anotasi ini, ia tidak akan berfungsi dengan betul! Jika anda berminat, anda boleh mengetahui lebih lanjut.)

    Nota: Dalam kod berikut, saya pergi terlalu jauh di sini, tetapi ini apa yang saya mahu lihat. Ia juga merupakan aliran input dan output Beri perhatian untuk membandingkan ini dengan contoh di atas.

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

    Cara yang lebih mudah tanpa menggunakan komponen apache adalah seperti berikut:

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

    Ini adalah satu-satunya langkah yang sebenarnya menulis fail, seperti yang ditunjukkan di atas Ini semua kod yang berkaitan dengan memproses nama fail dan laluan fail yang dimuat naik. Ketiga-tiga kaedah menggunakan HTTP ini semuanya mempunyai kod yang mengendalikan nama fail dan memuat naik laluan fail.

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

    part.write(filename);

    Atas ialah kandungan terperinci Bagaimana untuk menyalin fail tempatan ke fail rangkaian dan memuat naik menggunakan Java?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

    Kenyataan:
    Artikel ini dikembalikan pada:yisu.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam