先上移动端代码:retrofit+rxjava
Map<String, String> map = new HashMap<>(); File file = new File(Environment.getExternalStorageDirectory(), "DebugData/pic.jpeg"); RequestBody requestFile = RequestBody.create(MediaType.parse("multipart/form-data"), file); MultipartBody.Part part = MultipartBody.Part.createFormData("file", file.getName(), requestFile); OkHttpClient client = new OkHttpClient.Builder(). connectTimeout(60, TimeUnit.SECONDS). readTimeout(60, TimeUnit.SECONDS). writeTimeout(60, TimeUnit.SECONDS).build(); Retrofit retrofit = new Retrofit.Builder().baseUrl("http://shb2058.free.ngrok.cc") .addConverterFactory(StringConverterFactory.create()) .addCallAdapterFactory(RxJava2CallAdapterFactory.create()) .client(client) .build(); RetrofitInterface httpApiS = retrofit.create(RetrofitInterface.class); httpApiS.updateImage(part) .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(new Observer<String>() { @Override public void onSubscribe(@NonNull Disposable d) { } @Override public void onNext(@NonNull String loginBean) { Log.e("返回的数据", loginBean); TextView tt = (TextView) findViewById(R.id.ttt); tt.setText(loginBean); } @Override public void onError(@NonNull Throwable e) { } @Override public void onComplete() { } });
@Multipart @POST("/Practice_Project/MyServlet") Observable<String> updateImage(@Part MultipartBody.Part file);
服务端代码:
注:保存的地址是固定的C/picture;如果需要让外部可以通过url来访问图片,见博客http://blog.csdn.net/shb2058/article/details/77520925
DiskFileItemFactory factory =new DiskFileItemFactory(); //得到绝对文件夹路径,比如"D:\\Tomcat6\\webapps\\test\\upload" String path = request.getRealPath("/upload"); //临时文件夹路径 String repositoryPath =request.getRealPath("/upload/temp"); // 设定临时文件夹为repositoryPath factory.setRepository(new File(repositoryPath)); // 设定上传文件的阈值,如果上传文件大于1M,就可能在repository // 所代 表的文件夹中产生临时文件,否则直接在内存中进行处理 factory.setSizeThreshold(1024* 1024); // 创建一个ServletFileUpload对象 ServletFileUpload uploader =new ServletFileUpload(factory); try { // 调用uploader中的parseRequest方法,可以获得请求中的相关内容, // 即一个FileItem类型的ArrayList。FileItem是在 // org.apache.commons.fileupload中定义的,它可以代表一个文件, // 也可以代表一个普通的form field ArrayList<FileItem>list = (ArrayList<FileItem>)uploader.parseRequest(request); System.out.println(list.size()); for(FileItem fileItem : list) { if(fileItem.isFormField()) // 如果是普通的form field { String name = fileItem.getFieldName(); String value = fileItem.getString(); System.out.println(name+ " = " + value); } else // 如果是文件 { String value = fileItem.getName(); System.out.print("收到的文件名字"+value); // 名为fileName的文件中 fileItem.write(new File("c:/picture/test.jpeg")); } } } catch(Exception e) { e.printStackTrace(); } PrintWriter out = response.getWriter(); out.write("上传成功"); out.close(); out = null;
注:这里的代码有一个判断,看移动端代码,发现这个判断好像没用?其实这个判断是做传文件时候还传其他键值对数值的时候