ホームページ  >  記事  >  Java  >  Javaを使用してローカルファイルをネットワークファイルにコピーしてアップロードするにはどうすればよいですか?

Javaを使用してローカルファイルをネットワークファイルにコピーしてアップロードするにはどうすればよいですか?

WBOY
WBOY転載
2023-04-25 15:49:081424ブラウズ
    #ファイル コピー

    ファイル コピー:ローカル ファイルをあるディレクトリから別のディレクトリにコピーする。 (ローカルファイルシステム経由)

    メインコード
    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) を使用して、ファイルがある場所から別の場所にコピーされます。 (ネットワーク経由)

    #メインコード
    サーバー

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

    クライアント

    ##

    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):

    ここでは、最も一般的に使用されるファイルのアップロードを例として、サーブレット (3.0 以降) (JSP) テクノロジを使用します。

    HTTP プロトコルを使用して、ある場所から別の場所にファイルをコピーします。

    Apache コンポーネントを使用してファイル アップロードを実装する

    注: サーブレットを介した元のファイルのアップロードはより面倒であるため、このファイル アップロード機能を実現するためにいくつかのコンポーネントが使用されるようになりました。 (ファイル アップロードを記述する最も独創的な方法が見つかりませんでした。非常に面倒なはずです!) ここでは 2 つの jar パッケージ、

    commons-fileupload-1.4 が使用されています。 jar

    • commons-io-2.6.jar

    • 注: は、次の場所からダウンロードできます。 Apache Web サイト。

    ファイルをアップロードするためのサーブレット

    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 では、必要なフォームは 1 つだけです。

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

    操作の効果

    説明

    この処理はファイルのアップロードには適していますが、比較的成熟したテクノロジーを使用しています。入力ストリームと出力ストリームを理解したいと思っている人にとって、それはあまり良いことではありません。この例からは、基本的に入力ストリームと出力ストリームの使用法は確認できません。これらはすべてカプセル化されています。

    サーブレット 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);
    	}
    
    }

    サーブレット 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);
    		}
    	}
    Apache コンポーネントを使用しない簡単な方法は次のとおりです:

    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 を使用するこれら 3 つの方法にはすべて、ファイル名とアップロードされたファイル パスを処理するコードがあります。

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

    part.write(filename);

    以上がJavaを使用してローカルファイルをネットワークファイルにコピーしてアップロードするにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

    声明:
    この記事はyisu.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。