JavaWebプロジェクトでのファイルのアップロードとダウンロードの部分的な実現

記念品-深夜

深夜に、JavaWebプロジェクトのサーバーディレクトリなどのブラウザを使用してファイルをアップロードおよびダウンロードする方法について学んだことを記録します。

いわゆるファイルのアップロードとダウンロード

本質は、I / Oストリームの形式でファイルを読み書きすることです。AからBへのストリーミング、復元後、ファイル転送を実現できます。
実現プロセスは次のとおりです。

  1. アップロードするファイルを選択して送信します。
  2. サーバーはストリーミング形式で受信します。
  3. 対応するパスに書き込みます。
    本体はこれらの3つのステップであり、対応する特定のコードロジックは次のとおりです。

//在jsp页面添加表单,并且必须有enctype="multipart/form-data"属性
 <form action="saveFile" method="post" enctype="multipart/form-data">
      请选择文件:<input type="file" name="fileName" value=""><br>
      <input type="submit" name="提交">
    </form>

効果図は次のとおりです
実現効果図
。②2
番目のステップは少し複雑かもしれませんが、比較的簡単です。

//在对应控制类中,以流形式接收该文件
DiskFileItemFactory factory = new DiskFileItemFactory();
ServletFileUpload upload = new ServletFileUpload(factory);
List<FileItem> itemList = upload.parseRequest(req);
for(var item : itemList){
    
    //加强for循环是为了防止表单一次性有过多文件传输
	String realName = item.getName();//注意此处获得的是文件真实文件名,也就是从盘符开始的
	String[] name = realName.split("\\\\");//此处四个\是因为\自身本为转义符,再加上split方法的特殊性。有兴趣的伙伴可以自行了解
	realName = name[name.length-1];//这才是文件的名称
	InputStream inputStream = item.getInputStream();//以流形式接收到文件自身内容
}

この時点で、2番目のステップは完了です。しかし、言う必要があるのは、特に最初の2行のコードです。実際、外部でカプセル化されたjarパッケージが使用されます(アドレスは後ろにあります)。結局のところ、巨人の肩の上に立つことで、さらに遠くを見ることができます。論理はもっと複雑で、作者自身はまだ少しぼんやりしているので、説明しません。

実際、このステップを実現する方法は2つあります。1つ目は単純で、関心のあるパートナーは2つ目の原則を見ることができます。

item.write(new File("D://test/"+realFileName));//在上一个for循环中加入这一行就成功了,当然路径自选。

根底にある原則は、

OutputStream outputStream = new FileOutputStream("D://test/"+realFileName);//新建文件输入
	byte[] b = new byte[1024];//设定一次性写入大小
	int length = inputStream.read(b);//I/O流方式进行读取
	while(length!=-1){
    
    
		outputStream.write(b,0,length);//循环写入
		outputStream.flush();
		length = inputStream.read(b);
	}

このようにして、サーバーへのファイル転送を実現しました。私の退屈なテストの後、ローカルエリアネットワーク内の異なるコンピュータ間でファイルデータを転送することが可能です。パブリックIPに参加すると、わかりません。必要に応じて、この質問の穴を埋めましょう。

ファイルのダウンロードの原則は、アップロードとほぼ同じです。

  1. ブラウザにダウンロードするファイル名を送信します
  2. サーバーは、ファイルの内容を読み取るための入力ストリームを受信して​​作成します
  3. 対応するオブジェクトは出力ストリームを作成し、コンテンツをブラウザに応答します。
    最初のステップはここでは繰り返されません。2番目のステップはブラウザに応答するのがより面倒なので、応答ヘッダー情報と形式を設定する必要があります
String fileName = request.getParameter("fileName");//首先get到文件名
InputStream inputStream = new FileInputStream("D://test/"+fileName);//在服务器路径下读取该文件
 fileName = URLEncoder.encode(fileName,"UTF-8");//处理中文
 //  调用静态常量进行拼接字符串
        response.setContentType("application/x-msdownload");
        response.setHeader("Content-disposition","attachment;filename="+fileName);
        将内容响应回浏览器
        OutputStream outputStream = response.getOutputStream();
        byte[] b = new byte[1024];
        int length = inputStream.read(b);
        while(length!=-1){
    
    
            outputStream.write(b,0,length);
            outputStream.flush();
            length = inputStream.read(b);
        }

実現の手段は少し異なりますが、イデオロギーのレベルからはほとんど同じです。ファイルの流れが違うだけです。
真夜中、私自身の心はあまりはっきりしていません。一定期間の「大きな」イベントを記録してください。少しでもお役に立てば幸いです
。jarパッケージのアドレスほとんど忘れて
しまいました。Commons
-fileupload.jarcommons-io.jarは、によって提供されるパッケージです。 apache組織
。http:// commons .apache.org /
fileuploadとioのダウンロードを選択

おすすめ

転載: blog.csdn.net/qq_42673041/article/details/108655555