2017-06-22 32 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); 

希望它應該工作。