38.3SpringMVCはファイルアップロードを実装します
38.3.1ファイルアップロードに必要な前提条件
- フォームのenctype値は次のとおりである必要があります。
multipart/form-data
- (デフォルト:
application/x-www-form-urlencoded
)
- enctype:フォームリクエスト本文のタイプです
- メソッド属性の値は次のようにする必要があります
Post
- ファイル選択フィールドを提供する
<input type=”file” />
38.3.2ファイルアップロードの主成分分析
- フォームのenctype値がデフォルト値でない場合、request.getParameter()は無効になります。
- enctype =” application / x-www-form-urlencoded”の場合、フォームの本文の内容は次のとおりです。
key=value&key=value&key=value
- フォームフォームのenctype値がMutilpart / form-dataの場合、リクエスト本文の内容は次のようになります。
- 各部分は、MIMEタイプの説明の本文です。
- ------------------------------ 7de1a433602ac区切り文字
- Content-Disposition:form-data; name = "userName"プロトコルヘッダー
- aaa协议的正文
----------------------------- 7de1a433602ac Content-Disposition:form-data; name =“ file”;
filename =“ C:\ Users \ zhy \ Desktop \ fileupload_demofile \ b.txt”
- Content-Type:テキスト/プレーンプロトコルのタイプ(MIMEタイプ)
- bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
- ----------------------------- 7de1a433602ac-
38.3.3サードパーティコンポーネントを使用してファイルをアップロードする
- Commons-fileuploadコンポーネントを使用してファイルをアップロードするには、コンポーネントの対応するサポートjarパッケージをインポートする必要があります。 Commons-fileupload和commons-io。Commons-ioはファイルアップロードコンポーネントの開発jarファイルに属していませんが、Commons-fileuploadコンポーネントはバージョン1.1から始まります。動作するにはcommons-ioパッケージのサポートが必要です。
38.3.4従来のファイルアップロード
- ファイルをアップロードする従来の方法は、アップロードするファイルとアクセスするアプリケーションが同じサーバー上に存在することを意味します。また、アップロードが完了すると、ブラウザがジャンプする場合があります。
- 1.ファイルによってアップロードされたjarパッケージをインポートします
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>1.3.1</version>
</dependency>
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.4</version>
</dependency>
- 2.ファイルアップロード用のJSPページを作成します
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<h3>传统文件上传</h3>
<form action="user/fileupload1" method="post" enctype="multipart/form-data">
选择文件:<input type="file" name="upload" /><br/>
<input type="submit" value="上传" />
</form>
</body>
</html>
- ファイルアップロード用のコントローラーコントローラーを作成する
package com.xww.controller;
import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.File;
import java.util.List;
import java.util.UUID;
@Controller
@RequestMapping("/user")
public class UserController {
@RequestMapping("/fileupload1")
public String fileuoload1(HttpServletRequest request) throws Exception {
System.out.println("文件上传...");
String path = request.getSession().getServletContext().getRealPath("/uploads/");
File file = new File(path);
if(!file.exists()){
file.mkdirs();
}
DiskFileItemFactory factory = new DiskFileItemFactory();
ServletFileUpload upload = new ServletFileUpload(factory);
List<FileItem> items = upload.parseRequest(request);
for(FileItem item:items){
if(item.isFormField()){
}else{
String filename = item.getName();
String uuid = UUID.randomUUID().toString().replace("-", "");
filename = uuid+"_"+filename;
item.write(new File(path,filename));
item.delete();
}
}
return "success";
}
}
38.3.5SpringMVCの従来のファイルアップロードの主成分分析
38.3.6SpringMVCの従来のファイルアップロードコード
- SpringMVCフレームワークはMultipartFileオブジェクト、オブジェクトが表すアップロードしたファイル、請求変数名しなければならないフォームファイルタグのname属性名同じ。
- 1.構成ファイルパーサーオブジェクト
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<property name="maxUploadSize" value="10485760" />
</bean>
- 2.ファイルアップロード用のコントローラーコントローラーを作成します
@RequestMapping("/fileupload2")
public String fileuoload2(HttpServletRequest request, MultipartFile upload) throws Exception {
System.out.println("springmvc文件上传...");
String path = request.getSession().getServletContext().getRealPath("/uploads/");
File file = new File(path);
if(!file.exists()){
file.mkdirs();
}
String filename = upload.getOriginalFilename();
String uuid = UUID.randomUUID().toString().replace("-", "");
filename = uuid+"_"+filename;
upload.transferTo(new File(path,filename));
return "success";
}
- 3.ファイルアップロード用のJSPページを作成します
<h3>Springmvc文件上传</h3>
<form action="/user/fileupload2" method="post" enctype="multipart/form-data">
选择文件:<input type="file" name="upload" /><br/>
<input type="submit" value="上传" />
</form>
38.3.7SpringMVCクロスサーバーファイルのアップロード
- 1.開発に必要なjarパッケージをインポートします
<dependency>
<groupId>com.sun.jersey</groupId>
<artifactId>jersey-core</artifactId>
<version>1.18.1</version>
</dependency>
<dependency>
<groupId>com.sun.jersey</groupId>
<artifactId>jersey-client</artifactId>
<version>1.18.1</version>
</dependency>
- 2.ファイルアップロード用のJSPページを作成します
<h3>跨服务器文件上传</h3>
<form action="/user/fileupload3" method="post" enctype="multipart/form-data">
选择文件:<input type="file" name="upload" /><br/>
<input type="submit" value="上传" />
</form>
@RequestMapping("/fileupload3")
public String fileuoload3(MultipartFile upload) throws Exception {
System.out.println("跨服务器文件上传...");
String path = "http://localhost:9090/uploads/";
String filename = upload.getOriginalFilename();
String uuid = UUID.randomUUID().toString().replace("-", "");
filename = uuid+"_"+filename;
Client client = Client.create();
WebResource webResource = client.resource(path + filename);
webResource.put(upload.getBytes());
return "success";
}