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

来源:互联网 发布:明星页游 知乎 编辑:程序博客网 时间:2024/05/29 14:31

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

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

阅读全文
0 0