无法使用retrofit2将文件上传到服务器

时间:2017-06-22 05:42:56

标签: php android retrofit retrofit2

我想将.pdf文件上传到php代码为

的服务器
<?php

    $con = mysqli_connect("localhost","db_user","pwd","api_db");

        $user_id = $_POST['id'];
        $title = $_POST['cvTitle'];

        $allowedExts = array("docx","doc", "pdf", "txt");
    $temp = explode(".", $_FILES['cvfile']["name"]);
    $extension = end($temp);

    if ((($_FILES["cvfile"]["type"] == "application/pdf")
    || ($_FILES["cvfile"]["type"] == "application/text/plain")
    || ($_FILES["cvfile"]["type"] == "application/msword")
    || ($_FILES["cvfile"]["type"] == "application/vnd.openxmlformats-officedocument.wordprocessingml.document"))
    && in_array($extension, $allowedExts)){

      //inner if
      if ($_FILES["cvfile"]["error"] > 0){
        echo "Failed 1";
      } else{

      }// end inner else

      $f_name = time().$_FILES['cvfile']["name"];

      move_uploaded_file($_FILES['cvfile']["tmp_name"],
      "upload/" . $f_name);

      $file_name = $f_name;


      } else {

          $json = array("File Type Not Allowed"); 

      header('content-type: application/json');
      echo json_encode($json);
      } // end else 

    $query = "UPDATE users set cv = '$file_name', cvTitle = '$title' where id = '$user_id'";

    if (mysqli_query($db,$query)) {

          $json = array("cv" => $file_name, "cvTitle" => $title); 

      header('content-type: application/json');
      echo json_encode($json);
      }

?>

我的服务是

@FormUrlEncoded
    @Multipart
    @POST("updatecv.php")
    Call<User> uploadUserCV(@Field("id") String id,
                            @Field("cvTitle") String cvTitle,
                            @Part MultipartBody.Part cv);

最后我打电话给

@Override
    public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()){
            case R.id.action_cv : {
                Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
                intent.addCategory(Intent.CATEGORY_OPENABLE);
                intent.setType("*/*");

                startActivityForResult(Intent.createChooser(intent, "Choose file using"), Constant.REQUEST_CODE_OPEN);
                return true;
            }
        }
        return super.onOptionsItemSelected(item);
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);

        try {
            if (requestCode == Constant.REQUEST_CODE_OPEN){
                if (resultCode == RESULT_OK && null != data){
                    String type = Utils.getMimeType(UpdateProfileActivity.this, data.getData());
                    if (validateFileType(type)){
                        // Get the Image from data
                        Uri selectedFile = data.getData();
                        String[] filePathColumn = {MediaStore.Files.FileColumns.DATA};

                        Cursor cursor = getContentResolver().query(selectedFile, filePathColumn, null, null, null);
                        assert cursor != null;
                        cursor.moveToFirst();

                        int columnIndex = cursor.getColumnIndex(filePathColumn[0]);
                        mediaPath = cursor.getString(columnIndex);
                        cursor.close();

                        uploadFile();

                    } else {
                        Toast.makeText(UpdateProfileActivity.this, "File type is not allowed", Toast.LENGTH_SHORT).show();
                    }
                    Log.e("FILE_TYPE", Utils.getMimeType(UpdateProfileActivity.this, data.getData()));
                }
            }

        } catch (Exception e){
            e.printStackTrace();
        }

    }

    // Uploading CV
    private void uploadFile() {
        final Dialog dialog = Utils.showPreloaderDialog(UpdateProfileActivity.this);
        dialog.show();
        // Map is used to multipart the file using okhttp3.RequestBody
        File file = new File(mediaPath);

        // Parsing any Media type file
        final RequestBody requestBody = RequestBody.create(MediaType.parse("*/*"), file);
        MultipartBody.Part fileToUpload = MultipartBody.Part.createFormData("file", file.getName(), requestBody);

        mUserCall = mRestManager.getApiService().uploadUserCV(uid, file.getName(), fileToUpload);
        mUserCall.enqueue(new Callback<User>() {


            @Override
            public void onResponse(Call<User> call, Response<User> response) {

                User user = response.body();

                Log.e("UPLOADED_FILE", "name is " + user.getCvTitle());

                dialog.dismiss();
            }

            @Override
            public void onFailure(Call<User> call, Throwable t) {
                dialog.dismiss();
                Log.e("UPLOADED_FILE_ERROR", "Message is " + t.getMessage());
                Toast.makeText(UpdateProfileActivity.this, "Something went wrong", Toast.LENGTH_SHORT).show();
            }
        });

    }

    private boolean validateFileType(String type){
        String [] allowedFileTypes = {"application/vnd.openxmlformats-officedocument.wordprocessingml.document",
                                        "application/msword", "text/plain", "application/pdf"};
        for (int i = 0; i<=allowedFileTypes.length; i++){
            if (allowedFileTypes[i].equals(type)){
                return true;
            }
        }

        return false;
    }

但是此代码没有将文件上传到服务器没有任何错误。我想知道php代码或android端的错误在哪里。 任何帮助都非常感谢。

2 个答案:

答案 0 :(得分:1)

根据您的PHP,您正在寻找名称为cvfile的表单数据部分,但在Android代码中,您将file作为表单数据的名称传递部分。因此,您只需将file更改为cvfile,就像这样:

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

希望它能够奏效。

答案 1 :(得分:0)

似乎你正在测试localhost然后在app localhost url里面需要....抓住它 键入ipconfig(在Windows上的cmd中) 复制连接到局域网或wifi的ip。 然后检查是否存在该ip地址上的upload.php文件。 例如:192.168.1.102/upload.php 之后复制ip和 在改造客户端类中添加改造构建器的基本URL。 希望它能解决你的问题:)