IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Spring Web Java Discussion :

Téléchargement d´un fichier(FileUplad)


Sujet :

Spring Web Java

  1. #1
    Membre du Club
    Inscrit en
    Juin 2010
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Juin 2010
    Messages : 6
    Par défaut Téléchargement d´un fichier(FileUplad)
    Slt à tous,

    je veux ecrire une fonction en utilisant Spring WebFlow, qui permettra de télécharger un fichier(image) et le sauvegarder dans une base de donnée(avec Hibernate). Ce fichier sera ensuite lu et affiché.
    Est ce que quelqu´un peut me dire coe je pourrait faire cela.

    Merci d´avance pour votre aide.

  2. #2
    Membre averti
    Inscrit en
    Mars 2008
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Mars 2008
    Messages : 14
    Par défaut
    Bonjour,

    J'ai déja fait un upload de fichier avec Spring webflow 2.0.8. Cependant, pour le sauvegarder en BDD avec hibernate, je ne sais pas.
    La solution consiste à utiliser le jar commons-fileupload 1.2.1 d'Apache.

    Pour commencer, il faut définir un resolver pour les multipartFile :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    	<!-- permet de charger fes fichiers  -->	
    <bean id ="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"/>
    Dans le flow :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    <view-state id="maBeeeelleView" model="monModel" view="maJsp">
    	<transition on="importer" to="maBeeeelleView" validate="false">
    		<evaluate expression="importFichierService.importer( monModel, messageContext)"/>
    	</transition> 
    </view-state>
    L'objet monModel, instance de la classe MonModel, a été initialisé avant dans mon flow.

    La classe model :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    public class MonModel {
     
    	private byte[] fileContent;
     
    	public byte[] getFileContent() {
    		return fileContent;
     
    	public void setFile(MultipartFile file) throws IOException {
    		this.fileContent = file.getBytes();
    	}
    }
    Le setter multipartfile est utilisé par webflow pour charger le fichier dans la classe Model. Cependant, mettre un attribut MultipartFile dans le model ne fonctionne pas (pourquoi ? je ne sais pas), donc il est transformé en tableau de byte.

    dans la jsp
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    <form:form modelAttribute="monModel"  enctype="multipart/form-data">
    [...]
    <input type="file" name="file"  id=" fichier" />
    [...]
    et le bouton importer...
    et enfin le traitement du fichier dans mon service spring :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    public class ImportFichierService implements IImportFichierService {
     
    	public void importer(MonModel monModel ,OffrePromo offrePromo , MessageContext messageContext) throws Exception
    	{					
    		byte[] fileContent = monModel.getFileContent();
    		// fichier vide ?
    		if( fileContent == null){			
    			messages.addMessage(
    				new MessageBuilder()
    					.error()
    					.source("là où tu veux afficher le message d'erreur dans la jsp")
    					.text("fichier vide")
    					.build());
    		}		
    		InputStream inputStream = null;			
    		try
    		{
    			inputStream =  new ByteArrayInputStream(fileContent);
     
    		[...] tu fais ce que tu veux avec l'inputstream 
    	}
    }
    bonne chance pour le reste.

  3. #3
    Membre du Club
    Inscrit en
    Juin 2010
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Juin 2010
    Messages : 6
    Par défaut
    Slt,
    Merci pika822 pour ta reponse.
    J´ai fait cela un peu semblable à ce que tu a posté.
    Et je recois une erreur, que je n´arrive pas à resoudre.
    Voici les codes:
    Dans le JSP:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
     
    <form:form method="post" modelAttribute="fileUploadHandler" enctype="multipart/form-data">
    <table>
    	<c:if test="${fileUploaded}">
    		<p>File uploaded successfully.</p>
    		<c:if test="${!empty(file)}">
    			<pre style="border: solid 1px;">${file}</pre>
    		</c:if>
    	</c:if>
    	<tr>
    		<td>
    			Datei:
    		</td>
    		<td>
    			<input type="file" name="file" />
    		</td>
    	</tr>
    	<tr>
    		<td colspan="2"> </td>
    	</tr>
    	<tr>
    		<td colspan="2" class="buttonBar">
    			<input type="hidden" name="_flowExecutionKey" value="${flowExecutionKey}" />
    			<input type="submit" name="_eventId_upload" value="Bild hochladen" />
    		</td>
    	</tr>
    </table>
    </form:form>
    Dans le flow:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
     
    ...
     
    <var name="FileUploadAction" class="mmv.web.handler.FileUploadAction" />
     
    ...
     
    <view-state id="MymmvMandatoryData">
    	<transition on="change" to="Mymmvmandatorydatachange" /> 
    	<transition on="uploadPicture" to="UploadPicture" /> 
    </view-state>
     
    <view-state id="UploadPicture" model="FileUploadAction">
    	<transition on="upload" to="UploadFileAction"/>
    </view-state>
     
    <action-state id="UploadFileAction">
    	<evaluate expression="FileUploadAction.doExecute()" /> 
    	<transition on="success" to="UploadPicture">
    		<set name="flowScope.fileUploaded" value="true"/>
    	</transition>
    	<transition on="error" to="UploadPicture"/>
    </action-state>
    La classe model:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
     
    package mmv.web.handler;
     
    import org.springframework.web.multipart.MultipartFile;
    import org.springframework.webflow.action.AbstractAction;
    import org.springframework.webflow.execution.Event;
    import org.springframework.webflow.execution.RequestContext;
     
    public class FileUploadAction extends AbstractAction {
     
    	private static final long serialVersionUID = -8801901733860111694L;
     
    	protected Event doExecute(RequestContext context) throws Exception {
    		MultipartFile file = context.getRequestParameters().getRequiredMultipartFile("file");
    		if (file.getSize() > 0) {
    			// data was uploaded
    			context.getFlashScope().put("file", new String(file.getBytes()));
    			return success();
    		} else {
    			return error();
    		}
    	}
    }
    Je recois l´erreur suivante:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    ...
     
    org.springframework.webflow.execution.repository.snapshot.SnapshotCreationException: 
    Could not serialize flow execution; 
    make sure all objects stored in flow or flash scope are serializable
     
    ...
     
    java.io.NotSerializableException: mmv.web.handler.FileUploadAction
     
    ...
    Et là je ne sais plus quoi faire.
    Merci beaucoup pour votre aide.

    Citation Envoyé par pika822 Voir le message
    Bonjour,

    J'ai déja fait un upload de fichier avec Spring webflow 2.0.8. Cependant, pour le sauvegarder en BDD avec hibernate, je ne sais pas.
    La solution consiste à utiliser le jar commons-fileupload 1.2.1 d'Apache.

    Pour commencer, il faut définir un resolver pour les multipartFile :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    	<!-- permet de charger fes fichiers  -->	
    <bean id ="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"/>
    Dans le flow :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    <view-state id="maBeeeelleView" model="monModel" view="maJsp">
    	<transition on="importer" to="maBeeeelleView" validate="false">
    		<evaluate expression="importFichierService.importer( monModel, messageContext)"/>
    	</transition> 
    </view-state>
    L'objet monModel, instance de la classe MonModel, a été initialisé avant dans mon flow.

    La classe model :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    public class MonModel {
     
    	private byte[] fileContent;
     
    	public byte[] getFileContent() {
    		return fileContent;
     
    	public void setFile(MultipartFile file) throws IOException {
    		this.fileContent = file.getBytes();
    	}
    }
    Le setter multipartfile est utilisé par webflow pour charger le fichier dans la classe Model. Cependant, mettre un attribut MultipartFile dans le model ne fonctionne pas (pourquoi ? je ne sais pas), donc il est transformé en tableau de byte.

    dans la jsp
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    <form:form modelAttribute="monModel"  enctype="multipart/form-data">
    [...]
    <input type="file" name="file"  id=" fichier" />
    [...]
    et le bouton importer...
    et enfin le traitement du fichier dans mon service spring :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    public class ImportFichierService implements IImportFichierService {
     
    	public void importer(MonModel monModel ,OffrePromo offrePromo , MessageContext messageContext) throws Exception
    	{					
    		byte[] fileContent = monModel.getFileContent();
    		// fichier vide ?
    		if( fileContent == null){			
    			messages.addMessage(
    				new MessageBuilder()
    					.error()
    					.source("là où tu veux afficher le message d'erreur dans la jsp")
    					.text("fichier vide")
    					.build());
    		}		
    		InputStream inputStream = null;			
    		try
    		{
    			inputStream =  new ByteArrayInputStream(fileContent);
     
    		[...] tu fais ce que tu veux avec l'inputstream 
    	}
    }
    bonne chance pour le reste.

  4. #4
    Membre averti
    Inscrit en
    Mars 2008
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Mars 2008
    Messages : 14
    Par défaut
    Ah oui !!
    En dépersonnalisant mon exemple, j'ai fait une bêtise. Il faut que l'objet Model soit serializable. Un objet doit être serializable pour être mis dans l'un des scope de webflow ou dans l'attribut model d'un view-state.

    donc ma classe model devient
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    public class MonModel implements Serializable{
     
    	private byte[] fileContent;
     
    	public byte[] getFileContent() {
    		return fileContent;
     
    	public void setFile(MultipartFile file) throws IOException {
    		this.fileContent = file.getBytes();
    	}
    }
    Il faut donc que ta classe FileUploadAction soit serializable. C'est ce que te dit ton message d'erreur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    java.io.NotSerializableException: mmv.web.handler.FileUploadAction

    Cependant, je ne sais pas si ta solution fonctionnera.

  5. #5
    Membre du Club
    Inscrit en
    Juin 2010
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Juin 2010
    Messages : 6
    Par défaut
    Slt,
    le fichier dans mon service spring contient les erreurs que je n´arrive pas à resoudre.
    Voici le code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
     
    package mmv.service;
     
    import java.io.ByteArrayInputStream;
    import java.io.InputStream;
     
    import org.springframework.binding.message.MessageBuilder;
     
    import mmv.web.handler.FileUploadActions;
     
    public class ImportFileServiceImpl implements ImportFileService
    {
     
    	public void importFile(FileUploadActions Fileuploadactions) throws Exception
    	{
    		byte[] fileContent = Fileuploadactions.getFileContent();
    		// File leer ?
    		if( fileContent == null){
    			messages.addMessage(
    				new MessageBuilder()
    					.error()
    					.source("là où tu veux afficher le message d'erreur dans la jsp")
    					.text("File leer")
    					.build());
    		}		
    		InputStream inputStream = null;			
    		try
    		{
    			inputStream =  new ByteArrayInputStream(fileContent);
     
    		//[...] tu fais ce que tu veux avec l'inputstream 
     
    		}
    	}
    }
    Est-ce qu´on ne peux pas s´empasser de "messages" und "text" ?

    Citation Envoyé par pika822 Voir le message
    Ah oui !!
    En dépersonnalisant mon exemple, j'ai fait une bêtise. Il faut que l'objet Model soit serializable. Un objet doit être serializable pour être mis dans l'un des scope de webflow ou dans l'attribut model d'un view-state.

    donc ma classe model devient
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    public class MonModel implements Serializable{
     
    	private byte[] fileContent;
     
    	public byte[] getFileContent() {
    		return fileContent;
     
    	public void setFile(MultipartFile file) throws IOException {
    		this.fileContent = file.getBytes();
    	}
    }
    Il faut donc que ta classe FileUploadAction soit serializable. C'est ce que te dit ton message d'erreur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    java.io.NotSerializableException: mmv.web.handler.FileUploadAction

    Cependant, je ne sais pas si ta solution fonctionnera.

  6. #6
    Membre averti
    Inscrit en
    Mars 2008
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Mars 2008
    Messages : 14
    Par défaut
    Salut,
    Le bout de code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    if( fileContent == null){
    			messages.addMessage(
    				new MessageBuilder()
    					.error()
    					.source("là où tu veux afficher le message d'erreur dans la jsp")
    					.text("Fichier vide")
    					.build());
    		}
    est optionnel. C'est juste pour afficher un message d'erreur si le fichier est vide. D'ailleurs, tu verras qu'il y a un problème, d'où vient l'objet messages ? (oui, je n'avais pas les yeux en face des trous quand j'ai fait mon post)
    En fait, il doit être remplacé par messageContext.


    2 conseils :
    - dans tes posts, n'hésite pas à mettre la trace des erreurs
    - ne recopie pas le post précédent à chacun de tes post, ca ne sert à rien et ca alourdit la lecture du thread.

Discussions similaires

  1. Réponses: 3
    Dernier message: 26/10/2009, 13h32
  2. Téléchargement de fichier
    Par casafa dans le forum Web & réseau
    Réponses: 21
    Dernier message: 18/06/2009, 23h34
  3. Réponses: 5
    Dernier message: 05/11/2005, 17h53
  4. Réponses: 10
    Dernier message: 24/10/2005, 16h37
  5. [SOAP][XML][C#.NET] Téléchargement de fichiers XML
    Par juniorAl dans le forum XML/XSL et SOAP
    Réponses: 2
    Dernier message: 27/06/2005, 09h35

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo