【问题标题】:Facing Issue while uploading images using android Retrofit 2使用 android Retrofit 2 上传图像时面临的问题
【发布时间】:2018-11-26 07:42:29
【问题描述】:

我在使用改造 2 上传图片时遇到了一些问题。我有一个 api 来上传三种图像,例如(个人资料图像、横幅图像、其他图像)。我需要传递三个参数(user_id、type(profile/banner/other)、media(file))...我不明白该怎么做...

这是我的界面...

@Multipart
    @POST("media/upload_media")
    Call<ServerRespose> upload(
            @Part MultipartBody.Part file ,
            @Query("user_id") int user_id ,
            @Query("type") String type
    );

这是我想要做的事情......

 private void uploadFile(String path, Uri fileUri, final int type) {
        // create upload service client

        uid = DatabaseUtil.getInstance().getUser().getData().getID();
        String username = SharedPreferenceUtil.getStringValue(this, Constants.USERNAME);
        String password = SharedPreferenceUtil.getStringValue(this, Constants.PASSWORD);


        if (!username.isEmpty() && !password.isEmpty()) {
            Api service =
                    RetrofitUtil.createProviderAPIV2(username, password);

            //
            try {
                // use the FileUtils to get the actual file by uri
                showProgressDialog("Uploading");
                File file = new File(path);

                RequestBody requestFile =
                        RequestBody.create(
                                MediaType.parse(getContentResolver().getType(fileUri)),
                                file
                        );

                // MultipartBody.Part is used to send also the actual file name
                MultipartBody.Part body =
                        MultipartBody.Part.createFormData("file", file.getName(), requestFile);

                // finally, execute the request
                Call<ServerRespose> call = service.upload(body  , uid , "profile_image");
                call.enqueue(new Callback<ServerRespose>() {
                    @Override
                    public void onResponse(Call<ServerRespose> call,
                                           Response<ServerRespose> response) {
                        hideProgressDialog();
                        Log.v("Upload", "success");
                        ServerRespose item = response.body();
                        try {
                            if (item != null) {

    //                            item.setSuccess(true);
                                if (type == SELECT_PROFILE_PIC) {
                                    profileImageRecyclerViewAdapter.addNewItem(item);
                                    profileImageRecyclerViewAdapter.notifyDataSetChanged();
                                } else {
                                    bannerImageRecyclerViewAdapter.addNewItem(item);
                                    bannerImageRecyclerViewAdapter.notifyDataSetChanged();
                                }
                            }
                        } catch (Exception e) {
                            e.printStackTrace();
                        }
                    }

                    @Override
                    public void onFailure(Call<ServerRespose> call, Throwable t) {
                        AppUtils.showDialog(Profile_Activity.this, "There is some Error", null);
                        Log.e("Upload error:", t.getMessage());
                    }
                });
            } catch (Exception e) {
                e.printStackTrace();
            }
        } else {
            showDialogSignedUp("Session Expired Please Login Again...", null);
        }
    }

注意:我的代码不能正常工作,只是选择图像并显示上传,它也没有返回任何类型的响应......请任何人帮助我需要在很短的时间内完成这项工作的正确代码。 检查这里的参数...

 function save_image($request)
        {
            if(!empty($request['user_id'])){
                $user_identity  = $request['user_id'];
                $submitted_file = $_FILES['media'];

                $uploaded_image = wp_handle_upload( $submitted_file, array( 'test_form' => false ) );
                $type = $request[ 'type' ];
                //return $submitted_file;
                if ( !empty( $submitted_file )) {
                    $file_name = basename( $submitted_file[ 'name' ] );
                    $file_type = wp_check_filetype( $uploaded_image[ 'file' ] );

                    // Prepare an array of post data for the attachment.
                    $attachment_details = array(
                        'guid' => $uploaded_image[ 'url' ],
                        'post_mime_type' => $file_type[ 'type' ],
                        'post_title' => preg_replace( '/\.[^.]+$/', '', basename( $file_name ) ),
                        'post_content' => '',
                        'post_status' => 'inherit'
                    );

【问题讨论】:

  • 确保您的密钥与服务器请求密钥相同
  • 先签到邮递员
  • @Query 与@GET 方法一起使用。你应该使用@Field
  • 哪个键? @AndroidTeam
  • 它在邮递员@AndroidTeam 中正常工作

标签: java android retrofit retrofit2


【解决方案1】:

试试这个方法..

@Multipart
@POST(NetworkConstants.WS_REGISTER)
Call<UserResponseVo> registerUser(@Part MultipartBody.Part file, @PartMap Map<String, RequestBody> map);

在那之后..

 MultipartBody.Part fileToUpload = MultipartBody.Part.createFormData("file", file.getName(), mFile);


    RequestBody userName = RequestBody.create(MediaType.parse("text"), mEtUserName.getText().toString());
    RequestBody userEmail = RequestBody.create(MediaType.parse("text"), mEtEmail.getText().toString().trim());
    RequestBody userPassword = RequestBody.create(MediaType.parse("text"), mEtPassword.getText().toString().trim());

    Map<String, RequestBody> map = new HashMap<>();
    map.put(NetworkConstants.KEY_FIRST_NAME, userName);
    map.put(NetworkConstants.KEY_EMAIL, userEmail);
    map.put(NetworkConstants.KEY_PASSWORD, userPassword);

retrofit.create(ApiInterface.class).registerUser(fileToUpload, map);

【讨论】:

    【解决方案2】:

    试试这个

    1)在接口类中声明方法

      @Multipart
        @POST("media/upload_media")
        Call<AddImageResponseClass> upload(@Part("user_id") RequestBody user_id, @Part("media\"; filename=\"myfile.jpg\" ") RequestBody profile_pic,@Part("type") RequestBody type);
    

    然后在java类中

     String BASE_URL=base_url;
    
    final OkHttpClient okHttpClient = new OkHttpClient.Builder().writeTimeout(2, TimeUnit.MINUTES).retryOnConnectionFailure(true)
                    .readTimeout(2, TimeUnit.MINUTES)
                    .connectTimeout(2, TimeUnit.MINUTES)
                    .build();
    
            Retrofit retrofit = new Retrofit.Builder()
                    .baseUrl(BASE_URL).client(okHttpClient)
                    .addConverterFactory(GsonConverterFactory.create())
                    .build();
          Api service =
                    RetrofitUtil.createProviderAPIV2(username, password);
    
     File file = new File(path);
            RequestBody reqFile = RequestBody.create(MediaType.parse("image/*"), file );
            String user_id= user_id_here;
            String type= type_here;
            RequestBody reqUserId= RequestBody.create(MediaType.parse("text/plain"), user_id);
     RequestBody reqType= RequestBody.create(MediaType.parse("text/plain"), type);
            Call<ServerRespose> userCall = service.upload(reqUserId, reqFile,reqType);
            userCall.enqueue(new Callback<ServerRespose>() {
                @Override
                public void onResponse(Call<ServerRespose> call, Response<ServerRespose> response) {
    
                        if (response.body() == null) {
                          //handle here
                            return;
                        }
    
    
    
                }
    
                @Override
                public void onFailure(Call<ServerRespose> call, Throwable t) {
                    System.out.println("response failure" + t.getMessage());
                    t.printStackTrace();
                }
            });
    

    并导入这些

    implementation 'com.squareup.retrofit2:retrofit:2.3.0'
        implementation 'com.google.code.gson:gson:2.8.2'
        implementation 'com.squareup.retrofit2:converter-gson:2.3.0'
        implementation 'com.squareup.retrofit2:converter-scalars:2.3.0'
    

    【讨论】:

    • 我的 php 脚本是可读的.... 像这样的 'methods' => WP_REST_Server::READABLE,这意味着它是一个 get 请求,但 multipart 只支持 @POST 请求 .... 我应该怎么做现在
    • 可以改成post方式吗?
    • 我正在做,但我的回答是空的
    • 好的,你应该在这里发布一个带有 php 标签的新问题,以便 php 开发人员能够帮助你,亲爱的,我是前端开发人员 :)
    • 你能告诉我如何在一个数组中发布一些字段的数据,比如我们有四个字段 name , title , content , longitude 等......我们想将这四个字段的数据发送到像这样的数组 ... basics[name , title , content , longitude] ...你知道吗@QuickLearner
    猜你喜欢
    • 2021-08-28
    • 2017-09-28
    • 2018-04-11
    • 2018-07-04
    • 2020-01-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多