如何使用Spring Boot在jira任务上以附件形式上传带有utf-8符号名称的文件

问题描述

我正在尝试将jira任务上的文件作为附件上传

例如,我正在尝试上传名称“test-äöü.txt” 文件,并且它像“ test-???。txt” 一样出现在jira上

这是我的原始代码

RestTemplate restTemplate = restTemplateFactory.getInstance(RestTemplateUtil.getRequestFactory(proxyInfo,useEncryption));
File file = new File(filepath,filename);
MultiValueMap<String,Object> multipartMap = new LinkedMultiValueMap<>();
FileSystemResource var = new FileSystemResource(file);
multipartMap.add("file",var);

httpentity<MultiValueMap<String,Object>>  request = new httpentity<MultiValueMap<String,Object>>(multipartMap,RestTemplateUtil.buildHttpHeadersForUploadAttachment(jiraUser,jiraPass,useEncryption)

ResponseEntity<String> result = restTemplate.exchange( jiraAdressAttachFile,HttpMethod.POST,request,String.class);

我正在buildHttpHeadersForUploadAttachment 方法内容类型” 中设置“授权” “ X-Atlassian-Token” 标头,值为MediaType.MULTIPART_FORM_DATA

就像我说过的那样,文件名称“ test-???。txt” 的形式保存在jira上,然后我搜索了一些解决方案并尝试了这些解决方案,但对我没有任何帮助。 这是我尝试解决问题的解决方案:

restTemplate.getMessageConverters().stream()
             .filter(FormHttpMessageConverter.class::isinstance)
             .map(FormHttpMessageConverter.class::cast)
             .findFirst()
             .orElseThrow(() -> new IllegalStateException("Failed to find FormHttpMessageConverter"))
             .setMultipartCharset(StandardCharsets.UTF_8);

没用

restTemplate.getMessageConverters().stream()
             .filter(AllEncompassingFormHttpMessageConverter.class::isinstance)
             .map(AllEncompassingFormHttpMessageConverter.class::cast)
             .findFirst()
             .orElseThrow(() -> new IllegalStateException("Failed to find AllEncompassingFormHttpMessageConverter"))
             .setMultipartCharset(StandardCharsets.UTF_8);

没用

restTemplate.getMessageConverters().add(0,new FormHttpMessageConverter() {
                @Override
                protected String getFilename(Object part) {
                    if (part instanceof Resource) {
                        Resource resource = (Resource) part;
                        try {
                            return new String(resource.getFilename().getBytes(StandardCharsets.UTF_8));
                        } catch (UnsupportedEncodingException e) {
                            e.printstacktrace();
                            return null;
                        }
                    } else {
                        return null;
                    }
                }
            });

在此示例中,我尝试了StandardCharsets的所有可能值,但仍然无效

我也尝试过这个

FormHttpMessageConverter converter = new FormHttpMessageConverter();
            converter.setMultipartCharset(Charset.forName("UTF-8"));
            restTemplate.getMessageConverters().add(0,converter);

还有这个

List<HttpMessageConverter<?>> messageConverters = restTemplate.getMessageConverters();

            StringHttpMessageConverter stringMessageConverter = new StringHttpMessageConverter(Charset.forName("UTF-8"));
            ByteArrayHttpMessageConverter byteArrayHttpMessageConverter = new ByteArrayHttpMessageConverter();
            byteArrayHttpMessageConverter.setDefaultCharset(Charset.forName("UTF-8"));
            ResourceHttpMessageConverter resourceHttpMessageConverter = new ResourceHttpMessageConverter();
            resourceHttpMessageConverter.setDefaultCharset(Charset.forName("UTF-8"));
            FormHttpMessageConverter formHttpMessageConverter = new FormHttpMessageConverter();
            
            formHttpMessageConverter.setMultipartCharset(Charset.forName("UTF-8"));
            AllEncompassingFormHttpMessageConverter allEncompassingConverter = new AllEncompassingFormHttpMessageConverter();
            allEncompassingConverter.setCharset(Charset.forName("UTF-8"));
            allEncompassingConverter.setMultipartCharset(Charset.forName("UTF-8"));
            allEncompassingConverter.setPartConverters(Arrays.asList(stringMessageConverter,byteArrayHttpMessageConverter,resourceHttpMessageConverter));


for (Iterator<HttpMessageConverter<?>> iterator = messageConverters.iterator(); iterator.hasNext(); ) {
                HttpMessageConverter conv = iterator.next();
                if (conv instanceof AllEncompassingFormHttpMessageConverter) {
                    iterator.remove();
                }
            }
            messageConverters.add(allEncompassingConverter);
            restTemplate.setMessageConverters(messageConverters);

再次出现不良结果。

我在原始代码或尝试并描述的可能解决方案中做错了吗? 还是有我没有尝试过的东西,我必须做才能正确地运行我的代码

在发布请求之前,在FileFileSystemResourceMultiValueMap<String,Object>对象中,此文件具有正确的名称,例如“test-äöü.txt”

更新: 问题是春季启动版本低于2.0

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...