Как получить апплет для передачи изображения на веб-сервер

Я работаю над апплетом, который взаимодействует с подставкой и может записать изображение в файл с помощью этого кода:

sigObj.setImageXSize(30);
sigObj.setImageYSize(10);
sigObj.setImageJustifyMode(5);
sigObj.setImagePenWidth(5);
BufferedImage sigImage = sigObj.sigImage();
try
{
int w = sigImage.getWidth(null);
int h = sigImage.getHeight(null);
int[] pixels = new int[(w * h) * 2];

sigImage.setRGB(0, 0, 0, 0, pixels, 0, 0);
FileOutputStream fos = new
FileOutputStream("c:\\_img\\sig.jpg");
JPEGImageEncoder jpeg = JPEGCodec.createJPEGEncoder(fos);
jpeg.encode(sigImage);
fos.close();                            
}
catch (java.io.IOException exception) { System.out.println("Error IO Exception."); }

Цель состоит в том, чтобы передать файл на веб-сервер и в конечном итоге поместить изображение .jpg или .bmp в Oracle blob. Каков наилучший способ сделать это?

Просто гадать здесь:

Способ 1:
Попросите апплет записать файл .jpg как шестую кодированную строку, переместите строку в поле скрытой формы и отправьте страницу, где оракул может прочитать скрытое поле и преобразовать его в blob в pl/sql с помощью blobVar: = HEXTORAW (url ('sigJpg'));

Способ 2:
Попросите апплет выполнить POST и отправить файл

Мои навыки java довольно зеленые, поэтому я не уверен на 100%, если любой из этих методов рекомендуется. Как только файл перемещается на веб-сервер, я уверен, что могу найти способ вложить его в db, используя Oracle pl/sql. Я не уверен, как получить файл на веб-сервере.

1

2 ответы

Your method 2 is the method you should implement. Actually it is not a so huge problem. Here is a good example for you: http://www.exampledepot.com/egs/java.net/Post.html

Вы должны написать свое изображение в поток, который вы получаете из URL-соединения, точно так же, как и при написании файла.

Но этого недостаточно. Вы должны реализовать серверную сторону. Как правило, вы должны внедрить сервлет и переопределить его метод doPost() , где вы получите содержание своего сообщения. Затем сделайте то, что вам нужно: откройте JDBC-соединение и напишите файл в DB. Хотя я не рекомендую этот подход: вы не имеете ничего общего с BLOB в БД. Я думаю, что лучший способ - написать изображение в файловую систему и сохранить только путь к нему в БД.

Надеюсь, я дал вам достаточно советов. Вы можете найти более подробную информацию за 2 минуты googleing. Удачи.

0
добавлено
Используя пример, изображение записывается в URL-соединение (и никогда не касается локальной файловой системы). Вау, это было бы хорошо. Я не хочу использовать JDBC. Веб-страница, на которой установлен апплет, содержит информацию о сеансе/cookie. На самом деле было бы неплохо, если бы это также передавалось с помощью http POST (если это еще не так).
Также сохранение изображения в виде blob позволяет легко ограничить, кто может его видеть, без необходимости .access-файлов.
добавлено автор Brian McGinity, источник

Это работало. Я нашел пост с 2004 года, когда кто-то делал то же самое. Единственное различие заключается в том, что я превращаю файл в шестую строку перед отправкой. Единственная причина, по которой я это делаю, это то, что я знаю, как превратить шестнадцатеричную строку в blob в Oracle.

private String byteToString(byte[] data) {

    String text = new String();

    for ( int i = 0; i < data.length; i++ )
        text += (char) ( data[i] & 0x00FF );
    return text;
}

private static String bytesToHexString(byte[] bytes) {   
    StringBuilder sb = new StringBuilder(bytes.length * 2);   

    Formatter formatter = new Formatter(sb);   
    for (byte b : bytes) {   
        formatter.format("%02x", b);   
    }   

    return sb.toString();   
}  


public void writeImageToServer(URL scriptURL, BufferedImage img){
 try {
        ByteArrayOutputStream jpegOutput = new ByteArrayOutputStream();
        JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(jpegOutput);

        encoder.encode(img);//imagedata are coded here

        HttpURLConnection urlConnection = (HttpURLConnection)
        scriptURL.openConnection();
        urlConnection.setDoOutput(true);
        urlConnection.setDoInput(true);
        urlConnection.setUseCaches(false);

        urlConnection.setRequestMethod("POST");
        urlConnection.setRequestProperty("Content-type", "application/x-www-form-urlencoded");

        byte[] imageData = jpegOutput.toByteArray();

        //String imageString = byteToString(imageData);    //if you want a string
        String imageString = bytesToHexString(imageData);  //if you want hex string
        String content = "img=" + URLEncoder.encode (imageString,"UTF-8");

        urlConnection.setRequestProperty("Content-length", String.valueOf(content.length()));

        OutputStream urlout = urlConnection.getOutputStream();

        DataOutputStream printOut = new DataOutputStream(urlout);
        printOut.writeBytes(content);//writing data to the serverscript

        urlout.flush();
        urlout.close();
        printOut.flush();
        printOut.close();
        jpegOutput.flush();
        jpegOutput.close();

        urlConnection.disconnect();

        //System.err.println("Serverresponse: "+ urlConnection.getResponseMessage());

       //this works in firefox
        //try { getAppletContext().showDocument (new URL("javascript:msg(\""+ urlConnection.getResponseMessage() + "\")")); } catch (MalformedURLException me) { }

    }
    catch( IOException e ){ e.printStackTrace(); }
}

В oracle через mod_plsql:

procedure image_post_handeler ( img varchar2) is 
    b blob;
begin
    b := HEXTORAW( UTL_URL.UNESCAPE(url('img')) );
    insert into image_table (id,  b) values (id_seq.nextval, b  );  
end;

Чтобы быть готовым к производству, он должен будет иметь возможность подключения https и, возможно, файлов cookie. Я могу обойти проблему с файлом cookie, если я передам параметр url.

Я могу решить передать шестнадцатеричную строку обратно в браузер, поместить ее в скрытое поле в форме, а затем отправить форму.

Там могут быть лучшие способы сделать это. Это было чертовски интересно узнать, как создать апплет, jar класс, подписать его, поместить DLL-файлы повсюду. Просто выясняя, какой java-сервер, на котором работают апплеты, был проблемой там около 6, примерно 32 бит и 64 бит.

Спасибо за помощь. Это дало мне лучшее представление о том, что мне нужно для Google. Комментарии очень ценятся.

0
добавлено
Поздравляем с решением. Обязательно отметьте свой ответ как «принятый», чтобы другие могли узнать о вашем успехе. Приветствия ~
добавлено автор Andrew Kozak, источник
Поработав с этим немного, я нашел несколько вещей: 1. httpurlconnection может обрабатывать https-соединения. 2. Добавление дополнительных параметров URL-адресов аналогично созданию URL-адреса get, поэтому строка соединения может быть записана следующим образом: «f = 1234 & img =» + imageString 3. Нет необходимости кодировать шестнадцатеричную строку или декодировать ее на db , Шестнадцатеричная строка не содержит специальных символов.
добавлено автор Brian McGinity, источник
pro.jvm
pro.jvm
3 503 участник(ов)

Сообщество разработчиков Java Scala Kotlin Groovy Clojure Чат для нач-их: @javastart Наш сайт: projvm.com projvm.ru Наш канал: @proJVM Вакансии: @jvmjobs Конфы: @jvmconf

Java & Co
Java & Co
2 370 участник(ов)

Можно обсуждать с матом и без всё, что касается жабы, вплоть до холиваров. НЕ ИМЕЕТ ОТНОШЕНИЯ К САЙТУ JAVARUSH.RU ПРАВИЛА - https://t.me/javarush/75723 Вакансии сюда - https://telegram.me/joinchat/B7IzvUCnfo6d8t3yIxKguQ По вопросам - @thedude

learn.java
learn.java
1 888 участник(ов)

Чат для начинающих и не только Статистика: https://combot.org/chat/-1001083535868 Основной чат - @jvmchat

Java Underground
Java Underground
169 участник(ов)

https://vk.com/javatutorial

Javanese Questions
Javanese Questions
109 участник(ов)

Чат предназначен для обмена знаниями строго в формате в вопрос-ответ. Тема — Java, Kotlin и Android. Вопрос должен быть предварительно прогуглен, понятно и грамотно сформулирован, помечен хэштегами. Ответ — тем более. Куски кода размером в несколько строк можно писать прямо здесь, для больших кусков кода стоит использовать http://gist.github.com/, http://pastebin.com/, https://codeshare.io/ или любой аналогичный сервис. В некоторых случаях можно прикреплять скриншоты. Стикеры и гифки запрещены. Дополнять и уточнять вопросы и ответы — редактированием исходного сообщения. Обсуждения должны приводить к редактированию вопроса/ответа и удаляться. По хештегам можно искать существующие вопросы и овтеты: #вопрос #ответ #git #generics #java #server #awt #javafx #swing #kotlin #anko #tornadofx #ktor #android #recyclerView #performance #arch #network #permissions #storage #async