檔案的上傳
概述:
第一步,需要輸入流 讀入虛拟機程式中
第二步從虛拟機程式輸出流放到需要的路徑
思路:
1.用戶端 浏覽器如何處理---表單
2.action 中如何處理上傳的檔案
3.如何将檔案儲存到伺服器的某個位置。
uil:統一資源描述符 項目名+actionname名
method 送出方式 get不安全
post 協定體
<form action=" " method="post" enctype="" >
<input type="file" name="uplode" />
<input type="submit" value="确認上傳" />
</form>
詳細解釋說明:enctype :"application/x-wwww-form-urlencodel"--預設,伺服器可以根據表單的name屬性擷取表單的值
enctype="multipart/form-date"---這種形式,表單的資料會被以二進制的方式送到伺服器,伺服器可以等到使用者上傳的資訊。
伺服器端(背景)
UplodeAction{
需要接收用戶端上傳的内容(接收一個流)
如何将接收到的檔案存儲到伺服器的某個位置
}
檔案上傳(以上傳圖檔為列) 版本1
1.前台 jsp 頁面
<form action="/Io/uploade1" method="post" enctype="multipart/form-data">
<input type="file" name="uploade1"/>
<input type="submit" value="确認上傳"/>
</form>
2. struts2.xml檔案
<package name="p1" extends="struts-default" namespace="/">
<action name="uploade1" class="com.upload.Uploade1">
<result name="success" type="redirect">/success.jsp</result>
</action>
</package>
3.背景 Action
package com.upload;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import com.opensymphony.xwork2.ActionSupport;
//檔案的上傳 最原始版本
public class Uploade1 extends ActionSupport {
//接收上傳檔案的參數 資料類型必須為 File
private File uploade1;
public File getUploade1() {
return uploade1;
}
public void setUploade1(File uploade1) {
this.uploade1 = uploade1;
}
public String execute() throws IOException{
//将接收到的參數 放到輸入流中
InputStream is = new FileInputStream(uploade1);
//利用輸出流 給定目标檔案上傳的路徑及上傳後檔案的名稱 (絕對路徑)
OutputStream os = new FileOutputStream("D:\\apache-tomcat-7.0.88-windows-x64\\apache-tomcat-7.0.88\\webapps\\Io\\uplode1\\1.jpg");
//利用位元組流進行向外輸出
byte[] be = new byte[1024];
int len =0;
while(true){
len= is.read(be, 0, be.length);
if(len == -1) break;
os.write(be, 0, len);
}
is.close();
os.close();
return "success";
}
}
檔案上傳(以上傳圖檔為列) 版本2
1.jsp頁面:
<form action="/Io/uploade2" method="post" enctype="multipart/form-data">
<input type="file" name="upload"/>
<input type="submit" value="确認上傳"/>
</form>
2.struts2.xml 配置檔案
<struts>
<!-- 設定上傳檔案的大小限制 -->
<constant name="struts.multipart.maxSize" value="2097152000"></constant>
<package name="p1" extends="struts-default" namespace="/">
<action name="uploade2" class="com.upload.Uploade2">
<!--引入預設攔截器-->
<interceptor-ref name="defaultStack"></interceptor-ref>
<result name="load">/success.jsp</result>
</action>
</package>
</struts>
3.背景package com.upload;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import javax.servlet.ServletContext;
import org.apache.commons.io.FileUtils;
import org.apache.struts2.ServletActionContext;
import com.opensymphony.xwork2.ActionSupport;
public class Uploade2 extends ActionSupport {
//接收上傳檔案的參數 使用struts2架構進行 檔案上傳 接收的參數必須是 upload
private File upload;
//動态擷取上傳檔案的名稱 :擷取檔案上傳的原始名稱 表單元素name屬性的值+FileName
private String uploadFileName;
//指定目錄
private String directory;
public File getUpload() {
return upload;
}
public void setUpload(File upload) {
this.upload = upload;
}
public String getUploadFileName() {
return uploadFileName;
}
public void setUploadFileName(String uploadFileName) {
this.uploadFileName = uploadFileName;
}
public String getDirectory() {
return directory;
}
public void setDirectory(String directory) {
this.directory = directory;
}
public String execute() throws IOException{
ServletContext servletContext = ServletActionContext.getServletContext();
String realPath = servletContext.getRealPath("/directory/"+"/"+uploadFileName);
System.out.println("相對路徑="+realPath);
//第一個參數表示 前台 傳過來原始檔案,第二個參數是存儲檔案的相對路徑
FileUtils.copyFile(upload, new File(realPath));
return "load";
}
}
檔案的下載下傳
1.在伺服器上裝備好要下載下傳的檔案
1.1将檔案 copy 到下載下傳的目标
2.編寫 action
檔案下載下傳 樣例代碼
1.jsp 頁面:
<!--使用超連結-->
<body>
<a href="/Io/DownLoadAction?name=Java_20190123110336.flv">點選下載下傳</a>
</body>
2.struts2.xml檔案
<struts>
<!-- 設定上傳檔案的大小限制 -->
<constant name="struts.multipart.maxSize" value="2097152000"></constant>
<package name="p1" extends="struts-default" namespace="/">
<!-- 檔案下載下傳 -->
<action name="DownLoadAction" class="com.download.DownLoadAction">
<result type="stream">
<!-- 指定下載下傳檔案的類型 預設下載下傳為txt格式 本例為下載下傳視訊 -->
<param name="contentType">text/plain</param>
<!-- 下載下傳圖檔 -->
<!-- <param name="contentType">image/jpg</param> -->
<!-- 解釋說明:
contentDisposition:指定下載下傳檔案在浏覽器用戶端視窗打開還是以附件的形式下載下傳到本地
inline:==》在浏覽器視窗打開
attachment==>以附件的形式下載下傳到本地
-->
<param name="contentDisposition">attachment;filename=${name}</param>
<param name="bufferSize">1024</param>
</result>
</action>
</package>
</struts>
3.Action 背景代碼:
package com.download;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.InputStream;
import javax.servlet.ServletContext;
import javax.swing.JSlider;
import javax.swing.plaf.basic.BasicSliderUI;
import javax.swing.plaf.basic.BasicSliderUI.ActionScroller;
import org.apache.struts2.ServletActionContext;
import com.opensymphony.xwork2.ActionSupport;
public class DownLoadAction extends ActionSupport {
//接收參數 接收需要下載下傳檔案的名稱
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public InputStream getInputStream() throws FileNotFoundException{
//擷取伺服器上需下載下傳檔案的路徑
ServletContext sc = ServletActionContext.getServletContext();
InputStream is = new FileInputStream(sc.getRealPath("/upload"+"/"+name));
//傳回流
return is;
}
}