Я работаю над апплетом, который взаимодействует с панелью для подписи. API панели подписи имеет функцию, которая возвращает BufferedImage (предположим, что он называется API_CALL_TO_RETURN_BUFFERED_IMAGE ()). Я могу кодировать в JPEG и записать это изображение в файл просто отлично (с помощью FileOutputStream). Однако вместо записи на локальный диск мне нужно загрузить изображение в формате jpeg на сервер. Я могу POST данные на сервер просто отлично, и я могу просто закодировать изображение; но я изо всех сил стараюсь, чтобы две задачи встретились посередине.
Ниже приведена сокращенная версия кода (try-catch, function, classes пропущены):
ByteArrayOutputStream baos = new ByteArrayOutputStream();
JPEGImageEncode jie = JPEGCodec.createJPEGEncoder(baos);
jpeg.encode(API_CALL_TO_RETURN_BUFFERED_IMAGE()); // assume magic
// baos now contains jpeg data
URLConnection urlc = new URL(some_url).openConnection();
// set up urlc request headers and such
DataOutputStream dos = new DataOutputStream(urlc.getOutputStream());
dos.writeBytes(???); // ??? should be image=[the data in baos above]
// close stuff
Первоначально я думал:
String post_data = URLEncoder.encode("image=" + new String(baos.toByteArray()), some_charset);
dos.writeBytes(post_data);
Но это явно искажает изображение.
Так выглядит правильное (написанное локально) изображение
Я могу опубликовать только одну гиперссылку, но искаженное изображение здесь: imgur.com/mbmJL.jpg
Как записать ByteArrayOutputStream в DataOutputStream?
EDIT / UPDATE:
Мое решение состояло в том, чтобы сделать взаимный пост POST. Причиной установки заголовка Content-Type в качестве multipart / form-data была следующая ссылка: http://www.w3.org/TR/html401/interact/forms.html#h-17.13.4,:
multipart / form-data следует использовать для файлов, значений, отличных от ascii, или двоичных данных
Что касается записи ByteArrayOutputStream в DataOutputStream, он выглядит следующим образом:
dos.writeBytes(baos.toByteArray());
Я уверен, что это тривиально для программистов на Java, но не я!
Я не использовал предложенную библиотеку, потому что она предлагала намного больше, чем мне нужно.