1. 程式人生 > >Spring Test之檔案上傳篇

Spring Test之檔案上傳篇

Spring Test之檔案上傳篇

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資料夾下知道上傳的檔案。