上传文件使用离子库显示Null

时间:2017-05-03 13:14:44

标签: java android multipartform-data ion

我正在尝试将 PDF文件上传到服务器但是根据我的方法获得Null吐司,我测试了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());
    }
}

1 个答案:

答案 0 :(得分:0)

  

这是返回图库图像/文档/视频/音频

的文件路径的文件路径类

那个班级是一块垃圾。它不适用于任何Android设备上的许多Uri值,更不用说那些&#34;规则&#34;由于制造商的更改或操作系统更新,该类编码已更改。

此外,这些位置都不在getFilesDir()内。

正确使用Uri:使用ContentResolveropenInputStream()获取InputStream标识的内容Uri。将InputStream传递给Ion(如果它支持从流上传),或者使用流制作内容的本地副本(例如,进入getCacheDir()),然后上传本地副本。 / p>