¿HttpURLConnection de Java parece agregar 0018 caracteres en la solicitud?

Estoy tratando de enviar una imagen a través de HTTP.

Lo probé a través de Chrome, usando Wireshark para ver los detalles de la solicitud. La separación entre los encabezados y el contenido multiparte es \r\n.

Sin embargo, mi implementación, en Java, parece tener un ser de separación \r\ny el carácter 0018, que según FileFormat.info es el CANCELcarácter.

Estoy usando HttpURLConnection de Java (accedido desde Kotlin pero ese no debería ser el problema), aquí está la muestra del código, usado para escribir en el contenido del archivo:

val endl = "\r\n"
val hyphens = "--"
val boundary = "----${System.currentTimeMillis()}---"

// conn is an HttpURLConnection
val output = conn.outputStream
val writer = DataOutputStream(output)
writer.flush()

writer.writeUTF(hyphens + boundary + endl) // first time writing
writer.writeUTF("Content-Disposition: form-data; name: [REDACTED]" + endl)
writer.writeUTF("Content-Type: [REDACTED]" + endl)
writer.writeUTF(endl)

// [REDACTED: Writing the contents of the file]

writer.writeUTF(endl)
writer.writeUTF(hyphens + boundary + hyphens + endl)

writer.flush()
writer.close()

(el código completo para este ejemplo se puede encontrar aquí , líneas 99-144)

El carácter 0018se inserta justo antes de esa muestra de código, y justo después de los encabezados (que se escriben usando, HttpURLConnection.setRequestPropertyasí que no creo que puedan ser el problema ... por si acaso, puede encontrar ese código aquí , líneas 64-91) .

Aquí está el comienzo del cuerpo de la solicitud:

------1544883782650---
DContent-Disposition: form-data; name: "avatar"; filename: "wf.png"
Content-Type: image/png

(puede ver el carácter CANCELAR al comienzo de la primera línea, justo antes del límite).

En comparación con la solicitud realizada por Chrome:

------WebKitFormBoundaryAhYDuYuz5IuXB95v
Content-Disposition: form-data; name="avatar"; filename="discord.png"
Content-Type: image/png

Por alguna razón, Chrome no tiene esos personajes extraños.

Nota. Acabo de notar que Chrome usa form-data; name="avatar"; filename="discord.png"y yo uso form-data; name: "avatar"; filename: "wf.png"; Lo edité y volví a probar, ese no es el problema.

Respuesta 1

La documentación de writeUTFdice:

Primero, se escriben dos bytes en la secuencia de salida como si fuera por el método writeShort dando el número de bytes a seguir. Este valor es el número de bytes realmente escritos, no la longitud de la cadena. Después de la longitud, cada carácter de la cadena se emite, en secuencia, utilizando la codificación UTF-8 modificada para el carácter.

Lo que ve al principio de cada línea es probablemente los 2 caracteres que marcan el número de bytes a seguir.

Creo que DataOutputStreamno es ideal para su caso de uso. Utilice el write(byte[] bytes)método simple de OutputStreamdespués de convertir su encabezado Strings con s.getBytes("UTF-8").

Respuesta: 2

Así que estoy haciendo una detección de colisión simple donde el jugador se mueve hacia abajo 3 cada vez que se actualiza y no en el suelo, pero cuando está en el suelo se mueve la diferencia de su posición, y ...

En este momento estoy trabajando en un hilo que constantemente busca archivos .txt en una carpeta. Una vez que encuentra un archivo, se supone que lee el contenido, línea por línea, (usando un lector protegido y dividido (separador) ...

Me gustaría presentar mi situación primero, estoy haciendo un kernel tweaker que pasa varios comandos de shell usando Runtime.getRuntime (). Exec (...), funciona bien, pero el problema es que su ...

Estoy trabajando en un proyecto de Maven que requiere un SystemPropertyVariable (maven-surefire-plugin) para establecer en la línea de comando (-Dinstance = $ instance) y pasar el valor en CAP como se muestra a continuación mvn test -...