2017-06-22 83 views
0

我想.pdf文件上传到服务器,其中PHP代码是可能无法使用retrofit2

<?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端错误的地方在哪里。 任何帮助是高度赞赏。

+0

你可以[试试这个](https://stackoverflow.com/questions/35622676/image-upload-using-okhttp/35622812#35622812)。这只是供您参考,它工作正常。 –

回答

0

看来你是在本地主机上测试,然后内部需要应用本地主机URL ....抢那 键入ipconfig(在cmd中在Windows上) 复制连接到局域网或无线IP。 然后检查upload.php文件是否存在该ip地址。 例如:192.168.1.102/upload.php 之后复制ip和 添加在翻新客户端类中的翻新生成器的基础URL。 希望这将解决您的问题:)

+0

感谢您的建议,但是我使用远程服务器测试的文件不是本地主机,.php也可以在那里使用,但代码无法正常工作,请解决此问题的任何其他建议。 –

1

根据你的PHP,你要找的表单数据部分名称为cvfile,但在Android的代码,你传递file作为表单数据部分的名称。因此,所有你需要的是改变filecvfile,像这样:

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

希望它应该工作。