JavaWeb从入门到放弃(9)-实现一个客户端上传文件到服务端

时间:2021-05-21 13:06:52

先上移动端代码: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;

注:这里的代码有一个判断,看移动端代码,发现这个判断好像没用?其实这个判断是做传文件时候还传其他键值对数值的时候