欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2024-03-22 19:18:04
...

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

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