Depois de fazer login em segundo plano, escrevi um artigo. Como algumas descrições exigem código, inseri trechos de código.
Quando o resultado foi salvo, verificou-se que um erro foi relatado em segundo plano.
io.netty.handler.codec.http.multipart.HttpPostRequestDecoder$ErrorDataDecoderException: java.io.IOException: Unable to create temporary file, C:\Users\pys1714\AppData\Local\Temp\Attr_7771572786958116046_{"cid":4,"title":
Vendo um erro, inicialmente pensei que a estratégia para salvar era armazenar em cache como um arquivo, e havia uma limitação no tamanho dos dados, então comecei a deletar o texto e depurar. Descobri que parece não haver nenhum arquivo temporário gerado. Portanto, suspeitei que fosse algum motivo para criar o arquivo.
De acordo com o erro, encontre o método subjacente io.netty.handler.codec.http.multipart.HttpPostRequestDecoder.parseBodyAttributes()
Depois de observar o método, descobri que o netty estava lendo os dados que eu transmitia e fazendo algum tipo de julgamento um por um.
switch (currentStatus) {
case DISPOSITION:// search '='
// other code
break;
case FIELD:// search '&' or end of line
// other code
break;
default:
// just stop
sao.setReadPosition(0);
contRead = false;
break loop;
}
Notei que o comentário diz para consultar dois caracteres "=" e "&". Com uma tentativa, meu artigo contém apenas "=", clique em salvar e um erro é relatado conforme o esperado:
io.netty.handler.codec.http.multipart.HttpPostRequestDecoder$ErrorDataDecoderException: java.io.IOException: 文件名、目录名或卷标语法不正确。
Tentei "&" novamente, e o fiz.
Ainda não tenho uma solução específica, pois o erro é um método privado do netty.
Encontrou uma solução, https://juejin.im/post/5c63a028f265da2d9262c662
O método específico é,
Crie um pacote em src / main / java: io.netty.handler.codec.http.multipart
Encontre HttpPostStandardRequestDecoder.java
no código-fonte correspondente a netty-codec-http-4.1.30.Final.jar
Copie o código-fonte para o pacote criado na primeira etapa
Encontre parseBodyAttributes()
e adicione o seguinte código à primeira linha do método:
if(!this.request.headers().get("Content-Type").startsWith(APPLICATION_X_WWW_FORM_URLENCODED)){
return;
}
Hmm, depois de pesquisar por um longo tempo, descobri que a camada inferior do Blade relatou um erro. O coração está partido. Experimente primeiro o seu método.obrigado
Obrigado pelo método, mas lendo o código, não entendi o princípio. .Expressando ignorância
Atualize a dependência do Blade netty
<dependency>
<groupId>io.netty</groupId>
<artifactId>netty-codec</artifactId>
<version>4.1.31.Final</version>
</dependency>
Atualize a dependência do Blade netty
<dependency> <groupId>io.netty</groupId> <artifactId>netty-codec</artifactId> <version>4.1.31.Final</version> </dependency>
Tentei, o que significa que o problema não tem solução. . .
Encontrou uma solução, https://juejin.im/post/5c63a028f265da2d9262c662
O método específico é,
- Crie um pacote em src / main / java:
io.netty.handler.codec.http.multipart
- Encontre
HttpPostStandardRequestDecoder.java
no código-fonte correspondente a netty-codec-http-4.1.30.Final.jar- Copie o código-fonte para o pacote criado na primeira etapa
- Encontre
parseBodyAttributes()
e adicione o seguinte código à primeira linha do método:if(!this.request.headers().get("Content-Type").startsWith(APPLICATION_X_WWW_FORM_URLENCODED)){ return; }
- Use o comando maven do pacote para empacotar o conto
if(!this.request.headers().get("Content-Type").startsWith(APPLICATION_X_WWW_FORM_URLENCODED)){
return;
}
Este parâmetro está inativo ↓
if(!this.request.headers().get("Content-Type").startsWith("application/x-www-form-urlencoded")){
return;
}
Solução perfeita👍
Comentários muito úteis
Encontrou uma solução, https://juejin.im/post/5c63a028f265da2d9262c662
O método específico é,
Crie um pacote em src / main / java:
io.netty.handler.codec.http.multipart
Encontre
HttpPostStandardRequestDecoder.java
no código-fonte correspondente a netty-codec-http-4.1.30.Final.jarCopie o código-fonte para o pacote criado na primeira etapa
Encontre
parseBodyAttributes()
e adicione o seguinte código à primeira linha do método: