做爲一個Android開發,常常碰到項目週期緊張,然後臺來不及寫接口的狀況。爲了節約時間,本人特地向咱們公司的後臺工程師請教了一下如何搭建一個簡易的本地接口調試環境(SpringBoot)。廢話很少說,掏出神器!java
File -> New -> Project...
選擇左側Spring Initializr,選擇jdk版本,點擊Next 數組
總體的項目結構很相似AndroidStudio的項目目錄,DemoApplication便是整個Web應用的入口,application.properties中能夠配置應用的相關屬性設置緩存
咱們最終須要實現的接口地址參考以下(端口號默認爲8080):
http://localhost:8080/test/printMap
若須要指定端口號,則配置以下: app
在 com.example.demo 包下新建一 個HelloWorld 類(存放接口方法)以及一個bean目錄(存放接收的數據)
maven
在HelloWorld.java中標註路徑
ide
測試: 工具
注:這裏將multiParamTest對象轉爲Json對象用的是FastJson,添加方法以下(maven)測試
private File file = new File("d:"+File.separator+"files");
/** * 上傳文件 * * @param multipartFile 文件 * @return bean of UploadFile instance */
@RequestMapping("uploadFile")
public String uploadFile(@RequestParam("file") MultipartFile multipartFile) {
if (multipartFile.isEmpty()) {//若接收的文件爲空,則返回false
return JSON.toJSONString(new UploadFile(false, "accept none"));
}
if (!file.exists()) {//若用來存放文件的本地文件路徑不存在則建立路徑中的全部文件夾
file.mkdirs();
}
BufferedOutputStream outputStream = null;//緩存輸出流
try {
FileOutputStream fileOutputStream = new FileOutputStream(new File(file.getAbsolutePath() + "/" + multipartFile.getOriginalFilename()));
outputStream = new BufferedOutputStream(fileOutputStream);
outputStream.write(multipartFile.getBytes());
outputStream.flush();
return JSON.toJSONString(new UploadFile(true, "success"));//返回結果true,文件保存成功
} catch (IOException e) {
return JSON.toJSONString(new UploadFile(false, "error:" + e.getMessage()));//保存文件失敗,返回結果false,返回失敗緣由
} finally {
try {
if (outputStream != null) {
outputStream.close();//關閉輸出流
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
複製代碼
測試:ui
/** * 接收多個文件及參數 * @param multipartFiles 文件數組 * @param multiParamTest 其餘參數 * @return 上傳結果 */
@RequestMapping("uploadFiles")
public String uploadFiles(@RequestParam("files") MultipartFile[] multipartFiles, MultiParamTest multiParamTest) {
System.out.println("接收多個文件,param=" + JSON.toJSONString(multiParamTest));
if (multipartFiles.length == 0) {
return JSON.toJSONString(new UploadFile(false, "Detect No Files"));
}
if (!file.exists()) {
file.mkdirs();
}
String result = null;
for (MultipartFile multipartFile : multipartFiles) {
if (multipartFile == null) {
result = JSON.toJSONString(new UploadFile(false, "accept none"));
continue;
}
BufferedOutputStream outputStream = null;
try {
FileOutputStream fileOutputStream = new FileOutputStream(new File(file.getAbsolutePath() + "/" + multipartFile.getOriginalFilename()));
outputStream = new BufferedOutputStream(fileOutputStream);
outputStream.write(multipartFile.getBytes());
outputStream.flush();
result = JSON.toJSONString(new UploadFile(true, "success"));
} catch (IOException e) {
result = JSON.toJSONString(new UploadFile(false, "error:" + e.getMessage()));
break;
} finally {
try {
if (outputStream != null) {
outputStream.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
return result;
}
複製代碼
配置接收文件大小限制(-1爲不限制大小,或者eg:50MB):spa
新建一個JavaWebDemo工程用來測試(RxJava+Retrofit):
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Retrofit retrofit = new Retrofit.Builder()
.addCallAdapterFactory(RxJava2CallAdapterFactory.create())
.addConverterFactory(GsonConverterFactory.create())
.baseUrl("http://192.168.1.172:8080/test/")
.build();
Map<String, String> param = new HashMap<>();
param.put("str1", "123");
param.put("str2", "w234");
String filePath1 = "storage"+File.separator+"emulated/0/bluetooth/xx.apk";
String filePath2="storage/emulated/0/DingTalk/xx_1.apk";
Observable<BeanUpLoadFile> upLoadFileObservable = retrofit.create(Api.class)
.uploadFile(createReportParam("files", filePath1,filePath2),param);
upLoadFileObservable.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Observer<BeanUpLoadFile>() {
@Override
public void onSubscribe(Disposable d) {
}
@Override
public void onNext(BeanUpLoadFile beanUpLoadFile) {
Log.i(MainActivity.class.getSimpleName(), beanUpLoadFile.toString());
}
@Override
public void onError(Throwable e) {
Log.e(MainActivity.class.getSimpleName(),e.toString());
}
@Override
public void onComplete() {
}
});
}
/** * 生成上傳文件的參數 */
public MultipartBody.Part[] createReportParam(String paramName, String... filePath) {
MultipartBody.Part[] parts = new MultipartBody.Part[filePath.length];
for (int i=0;i<filePath.length; i++) {
File uploadFile = new File(filePath[i]);
RequestBody requestBody = RequestBody.create(MediaType.parse("multipart/form-data;charset=UTF-8"), uploadFile);
parts[i]=MultipartBody.Part.createFormData(paramName, uploadFile.getName(), requestBody);
}
return parts;
}
}
複製代碼
app打印接收接口結果日誌: