2017-05-03 97 views
-4

我想上傳一個PDF文件到服務器,但根據我的方法得到一個空敬酒,我測試了TextView中的文件路徑是可見的,但是當涉及到uplaoding它似乎沒有看到PDF文件,我使用ion library。以下是我的代碼示例。上傳文件顯示空使用離子庫

public void uploadFile(final String selectedFilePath){ 




     final ProgressDialog pd; 
     pd = new ProgressDialog(MainActivity.this); 
     pd.setMessage("Uploading ..."); 
     pd.setCancelable(false); 
     pd.show(); 
     //File file = new File(this.getFilesDir().getAbsolutePath() + "/thesubdirectory/the.zip"); 
     File f = new File(getApplicationContext().getFilesDir().getAbsolutePath()+selectedFilePath); 


     try { 
      RandomAccessFile rf = new RandomAccessFile(f, "rw"); 
      rf.setLength(1024 * 1024 * 2); 
     } catch (Exception e) { 
      System.err.println(e); 
     } 
     File echoedFile = getFileStreamPath("echo"); 
      Ion.with(MainActivity.this) 
        .load(SERVER_URL) 
        .uploadProgressDialog(pd) 
        .setMultipartFile("uploaded_file",f) 
        .write(echoedFile) 
        .setCallback(new FutureCallback<File>() { 
         @Override 
         public void onCompleted(Exception e, File result) { 


          try { 

           Toast.makeText(MainActivity.this, " " + result, Toast.LENGTH_LONG).show(); 

           System.out.println("Error " + result); 

           pd.dismiss(); 

          } catch (Exception e1) { 
           System.out.println("Error " + e1); 
          } 
          pd.dismiss(); 


         } 
        }); 



    } 

這是代碼的其餘部分。

public class MainActivity extends AppCompatActivity { 
    private static final int PICK_FILE_REQUEST = 1; 
    private static final String TAG = MainActivity.class.getSimpleName(); 
    private String selectedFilePath; 
    private String SERVER_URL = "http://192.168.43.104:8093/PoliceApp/FileUpload.aspx"; 
    ImageView ivAttachment; 


    private ImageView imageView; 
    private EditText firstname_edt,lastname_edt,email_edt,jobtitle_edt,source_edt; 
    private TextView directory_txt,count_txt,upload_txt; 
    private Button button; 
    Future<File> uploading; 
    ProgressDialog pd; 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     // Enable global Ion logging 
     Ion.getDefault(this).configure().setLogging("ion-sample", Log.DEBUG); 
     setContentView(R.layout.activity_main); 



     imageView= (ImageView)findViewById(R.id.imageView); 
     firstname_edt=(EditText)findViewById(R.id.firstname_edt); 
     lastname_edt=(EditText)findViewById(R.id.lastname_edt); 
     email_edt=(EditText)findViewById(R.id.email_edt); 
     jobtitle_edt=(EditText)findViewById(R.id.jobtitle_edt); 
     source_edt=(EditText)findViewById(R.id.source_edt); 
     button=(Button)findViewById(R.id.button); 
     directory_txt=(TextView)findViewById(R.id.directory_txt); 
     count_txt=(TextView)findViewById(R.id.count_txt); 
     upload_txt=(TextView)findViewById(R.id.upload_txt); 

     imageView.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       showFileChooser(); 
      } 
     }); 

     button.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       if(selectedFilePath != null){ 
        // pd = ProgressDialog.show(MainActivity.this,"","Uploading File...",true); 
        uploadFile(selectedFilePath); 
        // OnSendFileInfo(); 
       }else{ 
        Toast.makeText(MainActivity.this,"Please choose a File First",Toast.LENGTH_SHORT).show(); 
       } 
      } 
     }); 





    } 


    // Gallery pick 

    private void showFileChooser() { 
     Intent intent = new Intent(); 
     //sets the select file to all types of files 
     intent.setType("*/*"); 
     //allows to select data and return it 
     intent.setAction(Intent.ACTION_GET_CONTENT); 
     //starts new activity to select file and return data 
     startActivityForResult(Intent.createChooser(intent,"Choose File to Upload.."),PICK_FILE_REQUEST); 
    } 

    @Override 
    protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
     super.onActivityResult(requestCode, resultCode, data); 
     if(resultCode == Activity.RESULT_OK){ 
      if(requestCode == PICK_FILE_REQUEST){ 
       if(data == null){ 
        //no data present 
        return; 
       } 


       Uri selectedFileUri = data.getData(); 
       selectedFilePath = FilePath.getPath(this,selectedFileUri); 
       Log.i(TAG,"Selected File Path:" + selectedFilePath); 

       if(selectedFilePath != null && !selectedFilePath.equals("")){ 
        directory_txt.setText(selectedFilePath); 
       }else{ 
        Toast.makeText(this,"Cannot upload file to server",Toast.LENGTH_SHORT).show(); 
       } 
      } 
     } 
    } 

這是文件路徑類返回畫廊圖像的文件路徑/文件/視頻/音頻

public class FilePath { 



    /** 
    * Method for return file path of Gallery image/ Document/Video/Audio 
    * 
    * @param context 
    * @param uri 
    * @return path of the selected image file from gallery 
    */ 

    @TargetApi(19) 
    public static String getPath(final Context context, final Uri uri) { 

     // check here to KITKAT or new version 
     final boolean isKitKat = Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT; 

     // DocumentProvider 
     if (isKitKat && DocumentsContract.isDocumentUri(context, uri)) { 

      // ExternalStorageProvider 
      if (isExternalStorageDocument(uri)) { 
       final String docId = DocumentsContract.getDocumentId(uri); 
       final String[] split = docId.split(":"); 
       final String type = split[0]; 

       if ("primary".equalsIgnoreCase(type)) { 
        return Environment.getExternalStorageDirectory() + "/" 
          + split[1]; 
       } 
      } 
      // DownloadsProvider 
      else if (isDownloadsDocument(uri)) { 

       final String id = DocumentsContract.getDocumentId(uri); 
       final Uri contentUri = ContentUris.withAppendedId(
         Uri.parse("content://downloads/public_downloads"), 
         Long.valueOf(id)); 

       return getDataColumn(context, contentUri, null, null); 
      } 
      // MediaProvider 
      else if (isMediaDocument(uri)) { 
       final String docId = DocumentsContract.getDocumentId(uri); 
       final String[] split = docId.split(":"); 
       final String type = split[0]; 

       Uri contentUri = null; 
       if ("image".equals(type)) { 
        contentUri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI; 
       } else if ("video".equals(type)) { 
        contentUri = MediaStore.Video.Media.EXTERNAL_CONTENT_URI; 
       } else if ("audio".equals(type)) { 
        contentUri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI; 
       } 

       final String selection = "_id=?"; 
       final String[] selectionArgs = new String[] { split[1] }; 

       return getDataColumn(context, contentUri, selection, 
         selectionArgs); 
      } 
     } 
     // MediaStore (and general) 
     else if ("content".equalsIgnoreCase(uri.getScheme())) { 

      // Return the remote address 
      if (isGooglePhotosUri(uri)) 
       return uri.getLastPathSegment(); 

      return getDataColumn(context, uri, null, null); 
     } 
     // File 
     else if ("file".equalsIgnoreCase(uri.getScheme())) { 
      return uri.getPath(); 
     } 

     return null; 
    } 

    /** 
    * Get the value of the data column for this Uri. This is useful for 
    * MediaStore Uris, and other file-based ContentProviders. 
    * 
    * @param context 
    *   The context. 
    * @param uri 
    *   The Uri to query. 
    * @param selection 
    *   (Optional) Filter used in the query. 
    * @param selectionArgs 
    *   (Optional) Selection arguments used in the query. 
    * @return The value of the _data column, which is typically a file path. 
    */ 
    public static String getDataColumn(Context context, Uri uri, 
             String selection, String[] selectionArgs) { 

     Cursor cursor = null; 
     final String column = "_data"; 
     final String[] projection = { column }; 

     try { 
      cursor = context.getContentResolver().query(uri, projection, 
        selection, selectionArgs, null); 
      if (cursor != null && cursor.moveToFirst()) { 
       final int index = cursor.getColumnIndexOrThrow(column); 
       return cursor.getString(index); 
      } 
     } finally { 
      if (cursor != null) 
       cursor.close(); 
     } 
     return null; 
    } 

    /** 
    * @param uri 
    *   The Uri to check. 
    * @return Whether the Uri authority is ExternalStorageProvider. 
    */ 
    public static boolean isExternalStorageDocument(Uri uri) { 
     return "com.android.externalstorage.documents".equals(uri 
       .getAuthority()); 
    } 

    /** 
    * @param uri 
    *   The Uri to check. 
    * @return Whether the Uri authority is DownloadsProvider. 
    */ 
    public static boolean isDownloadsDocument(Uri uri) { 
     return "com.android.providers.downloads.documents".equals(uri 
       .getAuthority()); 
    } 

    /** 
    * @param uri 
    *   The Uri to check. 
    * @return Whether the Uri authority is MediaProvider. 
    */ 
    public static boolean isMediaDocument(Uri uri) { 
     return "com.android.providers.media.documents".equals(uri 
       .getAuthority()); 
    } 

    /** 
    * @param uri 
    *   The Uri to check. 
    * @return Whether the Uri authority is Google Photos. 
    */ 
    public static boolean isGooglePhotosUri(Uri uri) { 
     return "com.google.android.apps.photos.content".equals(uri 
       .getAuthority()); 
    } 
} 
+0

什麼是'selectedFilePath'和它在哪兒來自的價值? – CommonsWare

+0

好讓我告訴它來自哪裏 –

回答

0

這是文件路徑類返回圖庫圖片/文檔/視頻文件路徑/音頻

這個類是一片垃圾。它不適用於任何Android設備上的許多Uri值,更不用說那些由於製造商更改或操作系統更新而導致該類中編碼的「規則」發生更改的設備。

此外,沒有這些位置是getFilesDir()內部。

使用Uri正確:使用ContentResolveropenInputStream()獲得由Uri標識內容的InputStream。或者傳遞到InputStream離子(如果它支持從一個流上載),或使用流使內容的本地副本(例如,成getCacheDir()),然後上傳本地副本。

+0

你能告訴我像一個例子,因爲我得到了類的地方,和ISEE它顯示了所有可能的文件這是一個優勢,但讓我問你是我的離子結構正確 –

+0

@LutaayaHuzaifahIdris :「isee它顯示所有可能的文件,這是一個優勢」 - 不,它不。 *任何應用*都可以擁有支持「內容」Uri的「ContentProvider」。該課程從數百萬人中處理了四個應用程序,甚至沒有正確執行這四個應用程序。此外,您可能沒有直接文件系統訪問此類返回的路徑,即使它能夠返回。 – CommonsWare

+0

我到底這樣的事情要做,我堅持 –