У меня есть 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
?>