Spring Test之檔案上傳篇
阿新 • • 發佈:2018-12-26
1、上傳需要的簡單配置
1.1 匯入依賴包,包含檔案上傳、springtest4+和Junit4+包
<dependency> <groupId>org.springframework</groupId> <artifactId>spring-test</artifactId> <version>4.3.8.RELEASE</version> <scope>test</scope> </dependency> <dependency> <groupId>commons-fileupload</groupId> <artifactId>commons-fileupload</artifactId> <version>1.3.3</version> </dependency> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.12</version> <scope>test</scope> </dependency>
1.2 在springMVC的配置檔案上傳bean,如下:
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<property name="defaultEncoding" value="utf-8"/>
<property name="maxUploadSize" value="1024000000"/>
</bean>
上述程式碼中,defaultEncoding表示檔案上傳編碼格式,maxUploadSize表示允許上傳的檔案大小。
2、建立controller
@RequestMapping("/file") @Controller public class fileUpController { @ResponseBody @PostMapping("/up") public String upFile(@RequestParam("file") MultipartFile multipartFile,Model model){ String isSuccesString = "success"; File file = new File("D:\\files\\"); //建立資料夾 file.mkdirs(); try { //寫入新建立的資料夾 multipartFile.transferTo(new File(file, "fileName")); } catch (Exception e) { isSuccesString = "fail"; } return isSuccesString; } }
3、建立測試類
3.1 簡單檔案上傳(不通過io流)
@WebAppConfiguration
@ContextConfiguration({"classpath:spring-context.xml","classpath:spring-mvc.xml"})
@RunWith(SpringJUnit4ClassRunner.class)
public class MockTest {
private static final Logger LOGGER = Logger.getLogger(MockTest.class);
@Autowired
private WebApplicationContext wbc;
MockMvc mockMvc;
@Before
public void init(){
//建立MockMvc物件
this.mockMvc = MockMvcBuilders.webAppContextSetup(this.wbc).build();
}
@Test
public void test1() {
try {
ResultActions contentAsString = this.mockMvc.perform(MockMvcRequestBuilders.fileUpload("/file/up")
.file("file", "檔案內容".getBytes()));
} catch (Exception e) {
e.printStackTrace();
}
步驟:
(1)首先建立MockMvc物件
(2)呼叫MockMvc中的方法perform(RequestBuilder requestBuilder),該方法接收一個RequestBuilder物件。通過檢視原始碼,spring推薦我們使用MockMvcRequestBuilders:
該類有著豐富的http請求方法,比如get、post等,其中有fileUpload()方法用於檔案上傳。
fileUpload()引數表示檔案上傳的url地址,再呼叫file(String name,byte[] content)方法選擇上傳的檔案,第一個引數表示請求的key,第二個引數表示檔案的內容。這裡接收的是一個byte型別的陣列,但是並沒有設定檔名的地方,檢視原始碼可知,file()方法內部呼叫了MockMultipartFile類的建構函式,預設的檔名是 “ ”:
但是檔名在哪寫呢?第一個方法就是在Controller中的multipartFile.transferTo(new File(file, "fileName"));寫上檔名,例如fileName.很明顯這樣做是不合適的,畢竟上傳的檔名不可能寫死。第二種方法就是使用file()方法的另外一個過載方法
該方法接收一個MockMultipartFile的物件,該類有很多過載的建構函式:
3.2 通過io流上傳
更換file()方法,測試方法修改為: @Test
public void test() {
try {
InputStream resourceAsStream = this.getClass().getClassLoader().getResourceAsStream("spring-mvc.xml");
ResultActions contentAsString = this.mockMvc.perform(MockMvcRequestBuilders.fileUpload("/file/up")
.file(new MockMultipartFile("file","spring-mvc.xml","text/html",resourceAsStream)));
} catch (Exception e) {
e.printStackTrace();
}
}
通過使用file()的過載方法,我們可以指定方法名,以及通過io流上傳檔案。構造方法如下:
從原始碼註釋可以很清楚看到:name表示引數接收的key,originalFilename代表檔名,contentType表示檔案型別,contentStream表示檔案輸入流。 這樣,在Controller方法中,我們可以修改為
multipartFile.transferTo(new File(file, multipartFile.getOriginalFilename()));
通過上面兩種方法執行之後,就會在D:\files資料夾下知道上傳的檔案。