Когда я загружаю файл, используя html-форму и php, могу ли я также передать файл в java-апплет? - PullRequest
0 голосов
/ 29 декабря 2011

У меня есть Java-программа, которая анализирует изображения. Я хочу сделать программу доступной в веб-браузере.

Программа требует файл изображения от пользователя. С обычной программой Java это не проблема, так как у вас есть доступ к файловой системе пользователя. Однако в апплете это не так. Мой план состоял в том, чтобы пользователь загрузил изображение на мой сервер с помощью HTML-формы и php-программы. Это имеет дополнительное преимущество хранения фотографий для использования на сайте.

По соображениям безопасности рекомендуется поместить изображение в директорию над webroot. Однако это означает, что апплет не будет иметь доступа к изображению. Есть ли способ отправить изображение на сервер и в апплет? Из соображений безопасности я хотел бы избежать наличия программы, которая отправляет файлы, находящиеся вне webroot. Я также хотел бы избежать неприглядных предупреждений безопасности. Есть ли другой способ приблизиться к этому проекту?

Ниже приведен код php, который я использую для загрузки:

<?php

// the current directory
$current_directory = str_replace(basename($_SERVER['PHP_SELF']), '', $_SERVER['PHP_SELF']);

// the location of the program and uploads the file
$uploadProgram = 'http://' . $_SERVER['HTTP_HOST'] . $directory_self . 'webuploadcode.php';

// the maximum file size in bytes for the html upload form
$maximum_file_size = 300000; 

?>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"  "http://www.w3.org/TR/html4/strict.dtd">

<html>
<head>
    <link rel="stylesheet" type="text/css" href="stylesheet.css">
    <title>Upload form</title>
</head>

<body>
<form id="Upload" action="<?php echo $uploadProgram ?>" enctype="multipart/form-data" method="post">
    <h1>Upload form</h1>
    <p>Logged in as: <?php echo $_SERVER['PHP_AUTH_USER'] ?></p>
    <p><input type="hidden" name="MAX_FILE_SIZE" value="<?php echo $maximum_file_size ?>"></p>
    <p>
        <label for="file">Select a file to upload:</label>
        <input id="file" type="file" name="file">
    </p>
    <p>
        <label for="submit">Click to </label>
        <input id="submit" type="submit" name="submit" value="Upload File">
    </p>
</form>
</body>
</html>
<?php  

// the directory to receieve the files
$upload_directory = '../../photouploads/';

// the location of the upload form in case we need it
$upload_form = 'http://' . $_SERVER['HTTP_HOST'] . $directory_self .     'webuploadform.php';

// the location of the status page
$upload_status = 'http://' . $_SERVER['HTTP_HOST'] . $directory_self .     'uploadstatus.php';

// name of the fieldname used for the file in the HTML form
$fieldname = 'file';

$username = $_SERVER['PHP_AUTH_USER'];

// possible PHP upload errors
$errors = array(1 => 'php.ini max file size exceeded', 
                2 => 'html form max file size exceeded', 
                3 => 'file upload was only partial', 
                4 => 'no file was attached');

// check the upload form was actually submitted else print form
isset($_POST['submit']) or error('the upload form is needed', $upload_form);

// check for standard uploading errors
($_FILES[$fieldname]['error'] == 0) or error($errors[$_FILES[$fieldname]['error']], $upload_form);

// check that the file we are working on really was an HTTP upload
@is_uploaded_file($_FILES[$fieldname]['tmp_name']) or error('not an HTTP upload', $upload_form);

// blacklist php files
$blacklist = array(".php", ".phtml", ".php3", ".php4");

foreach ($blacklist as $item)
{ 
    if(preg_match("/$item\$/i", $_FILES[$fieldname]['tmp_name']))
    { 
        echo "We do not allow uploading PHP files.\n";
        exit;
    }
}

// check the size of the image to confirm that it is an image file 
@getimagesize($_FILES[$fieldname]['tmp_name']) or error('only image uploads are allowed', $upload_form);

// make a unique filename for the uploaded file 
$now = time();
//$_POST['credit']
while(file_exists($uploadFilename = $upload_directory.$now.'-'.$username.'.jpg'))
{ 
    $now++;
}

// move the file to the image folder and allocate it with the new filename
@move_uploaded_file($_FILES[$fieldname]['tmp_name'], $uploadFilename)
    or error('receiving directory insuffiecient permission', $upload_form);

// Redirect the client to the status page
header('Location: ' . $uploadStatus);

// an error handler which will be used if the upload fails
function error($error, $location, $seconds = 5)
{
    header("Refresh: $seconds; URL=\"$location\"");
    echo '<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"'."\n".
    '"http://www.w3.org/TR/html4/strict.dtd">'."\n\n".
    '<html lang="en">'."\n".
    '   <head>'."\n".
    '       <meta http-equiv="content-type" content="text/html; charset=iso-    8859-1">    '."\n\n".
    '       <link rel="stylesheet" type="text/css" href="stylesheet.css">    '."\n\n".
    '   <title>Upload error</title>'."\n\n".
    '   </head>'."\n\n".
    '   <body>'."\n\n".
    '   <div id="Upload">'."\n\n".
    '       <h1>Upload failure</h1>'."\n\n".
    '       <p>An error has occured: '."\n\n".
    '       <span class="red">' . $error . '...</span>'."\n\n".
    '       The upload form is reloading</p>'."\n\n".
    '    </div>'."\n\n".
    '</html>';
    exit;
} // end error handler

?>  

Ответы [ 2 ]

2 голосов
/ 29 декабря 2011

У меня есть Java-программа, которая анализирует изображения. Я хочу сделать программу доступной в веб-браузере.

Запустите JFrame по ссылке, используя Java Web Start .

приложение. запущенные с использованием JWS имеют доступ к JNLP API. JNLP API предлагает объект FileContents, позволяющий даже приложения в песочнице. открывать файлы и сохранять их в локальной файловой системе. Вот демоверсия . файловых сервисов .

В «песочнице» действие по извлечению файлового браузера вызывает запрос безопасности, подобный этому (взятый из связанной демонстрационной версии).

Security prompt from sand-boxed demo. when opening file


JWS также можно использовать для запуска встроенных апплетов в JRE Plug-In 2.


Если разработчик подписал цифровую подпись и доверял ей по запросу конечного пользователя, доверенный апплет может получить доступ к более распространенному JFileChooser / File.


Требуется ли вообще изображение на сервере? Если нет, то сохраните себе пропускную способность и проблемы. Если это так, апплет / приложение JWS. можете загрузить его после проверки работоспособности (например, по размеру в байтах, размеру и т. д.).

0 голосов
/ 29 декабря 2011

Один из вариантов - использовать апплет для загрузки файла, затем апплет загрузить его на сервер.Другой, менее желательный вариант - загрузить файл на сервер с помощью HTTP-сообщения, а затем загрузить его с сервера.

...