发送带有改型2的文件,文件名包含波斯字符

时间:2019-03-05 12:28:12

标签: android retrofit retrofit2 multipart

我正在发送经过翻新的multipart请求,它工作正常。但是当我的文件名包含波斯字符时,我的应用程序崩溃了,并且出现此错误:

  

java.lang.IllegalArgumentException:35英寸时出现意外的char 0x62f   Content-Disposition值:表单数据; name =“ photo”;   filename =“دوچرخه。jpg”

这是我发送多重请求的方式:

    File imageFile = new File(imagePath);

    ProgressRequestBody fileBody = new ProgressRequestBody(imageFile, this);
    MultipartBody.Part filePart = MultipartBody.Part.createFormData("photo", imageFile.getName(), fileBody);

    RetroInterface retroInterface = RetrofitClientInstance.getRetrofitInstance().create(RetroInterface.class);
    Call<SendFileResponse> call = retroInterface.sendPhoto(token, myHashmap, filePart);

如何解决此问题?!

3 个答案:

答案 0 :(得分:1)

我不是很完美的解决方案,因为它可以更改某些字符,所以要使用URLEncoder.encode(file.name, "utf-8")而不是纯名称。

答案 1 :(得分:0)

不过只是一个建议,但是作为一种变通办法,您尝试将文件重命名为文件名的ID(时间戳/其他内容),并添加一个名称字段,如果文件...,该字段将包含实际名称...

public class Object {
  private String filename;
  private File actualFile;
}

这样,以后检索时仍然可以始终引用所需的文件。

答案 2 :(得分:0)

我们可以使用addUnsafeNonAscii()类中的 Header.Builder 方法,通过该方法可以添加具有指定名称和值的标头。验证标题名称,允许使用非ASCII值。因此,我们也可以将任何语言字符作为值传递,包括波斯字符。

val fileName = "your file name with extention"
val reqFile = RequestBody.create(MediaType.parse("image/*"), File(imageDir))

val header = Headers.Builder()
header.addUnsafeNonAscii("Content-Disposition", "form-data; name=\"image\"; filename=\"$fileName")

val body = MultipartBody.Part.create(header.build(), reqFile)
myApi.uploadItem(body)
相关问题