Bonjour,
Sur mon site perso, j'ai une page permettant d'uploader des images sur mon site. Cette partie fonctionne, seulement je voudrai pouvoir prévisualiser l'image avant le téléchargement.
Je pensais le faire avec une applet, mais je rencontre quelques difficultés. Et d'autant plus que mon niveau en java est plutôt nul.
Suite à ce que j'ai pu lire sur le sujet, j'ai créé l'applet, je l'ai mise dans un jar et je l'ai signée.
Le problème que je rencontre est le suivant :
- Si je sélectionne l'image à l'aide d'un FileDialog déclenché à partir d'un bouton dans l'applet, j'arrive à l'afficher.
- Si je passe le nom du fichier par javascript du formulaire vers l'applet, j'obtiens l'erreur suivante : erreur java.security.AccessControlException: access denied (java.io.FilePermission D:\Photos\Nord\small\sP1020324.JPG read)
Par ce qu'un bout de code sera surempent plus clair, voici ce que j'ai fait :
Page html de test :<html>
<head>
<script type="text/javascript" language="javascript">
function fileDisplay2() {
var strTmp = escape(document.image.userfile2.value);
document.myApplet.displayFile2(strTmp);
}
</script>
<script type="text/javascript" language="javascript">
function strEscape() {
var strTmp2 = encodeURI(document.image.userfile2.value);
document.myApplet.setFilePath(strTmp2);
}
</script>
</head>
<body bgcolor="#ffffff">
<applet codebase="./" code="localfile2.class" archive="localfile2.jar" name="myApplet" width="500" height="500"></applet>
<form name="image" enctype="multipart/form-data" action="" method="POST">
<!-- Fonction de passage du répertoire à l'applet -->
<a href="javascript:strEscape();">Appel de setFilePath</a>
<p>
<!-- Fonction de passage du nom du fichier à l'applet -->
<a href="javascript:document.myApplet.setFileName('sP1020324.JPG');">Appel de setFileName</a>
<p>
<!-- Fonction de test de récupération de données de l'applet -->
<a href="javascript:alert(document.myApplet.getString());">Appel de getString</a>
<p>
<!-- Champ permettant de saisir un nom de fichier (par exmple : D:\Photos\JBVY\09-06-06\small\sP1020324.JPG) -->
<INPUT type="text" name="userfile2" id="userfile2" size="90">
<p>
<!-- Fonction de demande d'afichage du fichier dans l'applet -->
<input type=button value="Display" onClick="javascript:fileDisplay2(encodeURI(document.image.userfile2.value));"><p>
</form>
</body>
</html>
Code de l'applet :import java.applet.*;
import java.awt.*;
import java.util.*;
import java.lang.*;
import java.text.*;
import java.awt.event.*;
import java.io.*;
import javax.swing.*;
import java.net.URLDecoder;
public class localfile2 extends Applet {
String sFileName;
ImageIcon icon;
Image img;
String sjsFileName;
String sjsFilePath;
public localfile2() {
Panel p = new Panel();
Font f;
String osname = System.getProperty("os.name","");
if (!osname.startsWith("Windows")) {
f = new Font("Arial",Font.BOLD,10);
} else {
f = new Font("Verdana",Font.BOLD,12);
}
p.setFont(f);
p.add(new Button("Open"));
p.setBackground(new Color(255, 255, 255));
add("North",p);
}
public boolean action(Event evt, Object arg) {
if (arg.equals("Open")) {
System.out.println("OPEN CLICKED");
// cette méthode fonctionne
Frame parent = new Frame();
FileDialog fd = new FileDialog(parent, "Please choose a file:", FileDialog.LOAD);
fd.show();
String selectedItem = fd.getFile();
if (selectedItem == null) {
// no file selected
} else {
// read the file
//System.out.println("reading file " + fd.getDirectory() + File.separator + fd.getFile() );
sFileName = fd.getDirectory() + File.separator + fd.getFile();
displayFile(sFileName);
}
} else return false;
return true;
}
public void paint(Graphics g)
{
int width, height;
if (img!=null) {
width = img.getWidth(this);
height = img.getHeight(this);
if (width < height) {
if (height <= 500) {
g.drawImage(img, 0, 40, this);
}else {
double ratio = 500 / (double) height;
double temp2 = width*ratio;
int temp = (int) temp2;
g.drawImage(img, 0, 40, temp, 500, this);
}
} else {
if (width <= 500) {
g.drawImage(img, 0, 40, this);
}else {
double ratio = 500 / (double) width;
double temp2 = height*ratio;
int temp = (int) temp2;
g.drawImage(img, 0, 40, 500, temp, this);
}
}
}
}
public void displayFile (String sFileName){
System.out.println("file name : " + sFileName);
try {
String slocalFileName = URLDecoder.decode(sFileName, "UTF-8");
System.out.println("slocalFileName : " + slocalFileName);
icon = new ImageIcon(slocalFileName);
img = icon.getImage();
repaint();
}
catch (Exception e)
{
System.out.println("erreur " + e.toString());
}
}
// quand j'appelle cette fonction directement de la page html, ça génère l'exception
public void displayFile2 (String sPathName){
System.out.println("path name : " + sPathName);
try {
String slocalFileName = URLDecoder.decode(sPathName, "UTF-8");
System.out.println("slocalFileName : " + slocalFileName);
icon = new ImageIcon(slocalFileName);
img = icon.getImage();
repaint();
}
catch (Exception e)
{
System.out.println("erreur " + e.toString());
}
}
public String getString() {
return sFileName;
}
public void setFileName(String s) throws Exception
{
try {
sjsFileName = new String( s );
System.out.println("sjsFileName : " + sjsFileName);
return ;
}
catch (Exception e)
{
System.out.println("erreur " + e.toString());
}
}
public void setFilePath(String s) throws Exception
{
try {
sjsFilePath = new String( s );
System.out.println("sjsFilePath (encodé): " + sjsFilePath);
System.out.println("sjsFilePath (décodé): " + URLDecoder.decode(sjsFilePath, "UTF-8"));
sjsFilePath = new String( URLDecoder.decode(sjsFilePath, "UTF-8") );
return ;
}
catch (Exception e)
{
System.out.println("erreur " + e.toString());
}
}
}
Je voulais uniquement me servir de l'applet pour afficher l'image.
Mon formulaire définitif est écrit en php, et utilise la variable $_FILES, qui contient des informations sur le fichier à télécharger.
Le problème si je sélectionne le fichier directement dans l'applet est que cette variable globale $_FILES n'est pas renseignée et que je ne sais pas comment le faire "à la main".
Merci de m'aider à résoudre ce problème d'accès.
Emmanuel