上传名称包含UTF-8字符的文件

Upload the file with names that contain the characters of the UTF-8

我在某些文件(使用 UTF-8 字符)中使用上传方法时遇到问题。当我select这些文件时,我会遇到以下错误:

FATAL EXCEPTION: Thread-34 Process: com.articlerdotir.articler, PID: 27672 java.lang.NullPointerException: Attempt to invoke interface method 'int java.lang.CharSequence.length()' on a null object reference at java.util.regex.Matcher.reset(Matcher.java:995) at java.util.regex.Matcher.(Matcher.java:174) at java.util.regex.Pattern.matcher(Pattern.java:1006) at okhttp3.MediaType.parse(MediaType.java:52) at com.articlerdotir.articler.activity.UploaderActictivity.UploadFile(UploaderActictivity.java:186) at com.articlerdotir.articler.activity.UploaderActictivity.run(UploaderActictivity.java:154) at java.lang.Thread.run(Thread.java:762)

当我select这些文件并上传时,会遇到如下情况。 例如当文件名为:DellaAli.doc0123.doc时不会出问题,但是当文件名为 دلهعلی.doc0123.doc 此代码无法正常工作。如何解决这个问题?谢谢

这是我的上传器代码 activity:

public class UploaderActictivity extends AppCompatActivity  {
private Button button_browse,button_upload;
JustifiedTextView js,messageText;
ImageView imNotify;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_uploader);

    js=findViewById(R.id.textDes);
    messageText =findViewById(R.id.messageText);
    imNotify =findViewById(R.id.notify);
    button_browse = (Button) findViewById(R.id.browse);
    button_upload =(Button) findViewById(R.id.upload);


    js.setText( getResources().getString(des) + "\n" +
            getResources().getString(des1)+ "\n" +
            getResources().getString(des2)+ "\n" +
            getResources().getString(des3));

    if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.M){
        if(ActivityCompat.checkSelfPermission(this, Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED){
            requestPermissions(new String[]{Manifest.permission.READ_EXTERNAL_STORAGE},100);
            return;
        }
    }

    browse_btn();
    upload_btn();
}


private void browse_btn() {

    button_browse.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            new MaterialFilePicker()
                    .withActivity(UploaderActictivity.this)
                    .withRequestCode(10)
                    .start();

        }
    });
}



@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
    if(requestCode == 100 && (grantResults[0] == PackageManager.PERMISSION_GRANTED)){
        browse_btn();
    }else {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
            requestPermissions(new String[]{Manifest.permission.READ_EXTERNAL_STORAGE},100);
        }
    }
}

ProgressDialog progress;

@Override
protected void onActivityResult(int requestCode, int resultCode, final Intent data) {
    if(requestCode == 10 && resultCode == RESULT_OK){
        String filePath = data.getStringExtra(FilePickerActivity.RESULT_FILE_PATH);
            messageText.setText(filePath);
    }
}


private void upload_btn() {
    button_upload.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {

            progress = new ProgressDialog(UploaderActictivity.this);
            progress.setTitle("Uploading");
            progress.setMessage("Please wait...");
            progress.setCancelable(false);
            progress.show();


            Thread t = new Thread(new Runnable() {
                @Override
                public void run() {

                    File f = new File(messageText.getText().toString());
                    if(f.isFile()) {
                        UploadFile(f);

                    }else {
                        messageText.setText(getResources().getString(uploadFile));
                    }
                }
            });

            t.start();


        }
    });
}

private String getMimeType(String path) {

    String extension = MimeTypeMap.getFileExtensionFromUrl(path);

    return MimeTypeMap.getSingleton().getMimeTypeFromExtension(extension);
}

public void UploadFile(final File f){


    String content_type = getMimeType(f.getPath());
    String file_path = f.getAbsolutePath();

    SharedPreferences prefs =
            PreferenceManager.getDefaultSharedPreferences(UploaderActictivity.this);
    final int UserID = prefs.getInt("UserID", 0);

    OkHttpClient client = new OkHttpClient();
    RequestBody file_body = RequestBody.create(MediaType.parse(content_type), f);

    RequestBody request_body = new MultipartBody.Builder()
            .setType(MultipartBody.FORM)
            .addFormDataPart("type", content_type)
            .addFormDataPart("uploaded_file",
                    UserID + "_" + file_path.substring(file_path.lastIndexOf("/") + 1), file_body)
            .build();

    Request request = new Request.Builder()
            .url(AppConfig.upLoadServerUri + "/upload")
            .post(request_body)
            .build();

    try {
        Response response = client.newCall(request).execute();

        if (!response.isSuccessful()) {
            throw new IOException("Error : " + response);

        }

        progress.dismiss();

        runOnUiThread(new Runnable() {
            @Override
            public void run() {

                messageText.setText(getResources().getString(DescriptionForUpload));

            }
        });

    } catch (IOException e) {
        progress.dismiss();
        e.printStackTrace();
        runOnUiThread(new Runnable() {
            @Override
            public void run() {

                messageText.setText(getResources().getString(uploadAgain));

            }
        });
    }


}


@Override
protected void onDestroy()
{
    super.onDestroy();
    if (progress!=null && progress.isShowing()){
        progress.dismiss();
    }
    }



}

你的 getMimeType return null 的问题 只需更改 getMimeType 函数宽度 this

private fun getMimeType(path: String): String? {
        val extension = MimeTypeMap.getFileExtensionFromUrl(path)
        return if(extension.isNullOrEmpty()){
            val i = path.lastIndexOf('.')
            if (i > 0) {
                path.substring(i + 1)
            }else{
                MimeTypeMap.getSingleton().getMimeTypeFromExtension(extension)
            }
        }else{
            MimeTypeMap.getSingleton().getMimeTypeFromExtension(extension)
        }
    }

此代码在 kotlin 中