2017-05-03 95 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

我到底这样的事情要做,我坚持 –