Telegram, Java: upload file to send in sendAnimati

2019-08-21 04:14发布

问题:

There's a method in Telegram API called sendAnimation. There are two obligatory paramteres: chat_id and animation. animation's descriptio is this:

Type: InputFile or String

Description: Animation to send. Pass a file_id as String to send an animation that exists on the Telegram servers (recommended), pass an HTTP URL as a String for Telegram to get an animation from the Internet, or upload a new animation using multipart/form-data. More info on Sending Files »

I have a local .gif file that I want to send. So it looks like I need to use that multipart/form-data method. I don't understand what that method is. I checked out the InputFile type's description:

InputFile This object represents the contents of a file to be uploaded. Must be posted using multipart/form-data in the usual way that files are uploaded via the browser.

Again, they write about that multipart/form-data thing, but don't write what exactly that is.

I thought maybe I could upload a file using sendDocument method, but the uploaded document must be of type InputFile as well.

How do I make the InputFile object out of my local .gif? I can convert it to Java's InputStream, but that's about it.

回答1:

simply multipart/form-data is just an encryption type for the sent data there are three types of encryption in forms:

  • application/x-www-form-urlencoded (the default)
  • multipart/form-data
  • text/plain

for more info about multipart/form-data check this link

I don't know what is the type of your GIF object in java but let us consider it a binary file then you would simply post this text as follows using POST request:

String url = "uploading url";
String charset = "UTF-8";
String param = "value";
File binaryFile = new File("/path/to/file.bin");
String boundary = Long.toHexString(System.currentTimeMillis()); // Just generate some unique random value.
String CRLF = "\r\n"; // Line separator required by multipart/form-data.

URLConnection connection = new URL(url).openConnection();
connection.setDoOutput(true);
connection.setRequestProperty("Content-Type", "multipart/form-data; boundary=" + boundary);

try {
    OutputStream output = connection.getOutputStream();
    PrintWriter writer = new PrintWriter(new OutputStreamWriter(output, charset), true);
     // Send binary file.
    writer.append("--" + boundary).append(CRLF);
    writer.append("Content-Disposition: form-data; name=\"binaryFile\"; filename=\"" + binaryFile.getName() + "\"").append(CRLF);
    writer.append("Content-Type: " + URLConnection.guessContentTypeFromName(binaryFile.getName())).append(CRLF);
    writer.append("Content-Transfer-Encoding: binary").append(CRLF);
    writer.append(CRLF).flush();
    Files.copy(binaryFile.toPath(), output);
    output.flush(); // Important before continuing with writer!
    writer.append(CRLF).flush(); // CRLF is important! It indicates end of boundary.

    // End of multipart/form-data.
    writer.append("--" + boundary + "--").append(CRLF).flush();
}

// Request is lazily fired whenever you need to obtain information about response.
int responseCode = ((HttpURLConnection) connection).getResponseCode();
System.out.println(responseCode); // Should be 200