上传名称包含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.doc或0123.doc时不会出问题,但是当文件名为 دلهعلی.doc 或 0123.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 中
我在某些文件(使用 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.doc或0123.doc时不会出问题,但是当文件名为 دلهعلی.doc 或 0123.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 中