Comment publier appel ajax avec multipart/form-data?
J'ai besoin de télécharger un fichier à partir d'extjs page, via l'appel AJAX, pour le serveur. Je suis en mesure de le faire avec une simple page HTML à servlet, mais à l'aide de extjs (v4.0.7) je ne reçois pas de fichier dans ma servlet quand je pars demande. Servlet reconnaît multipart page, mais rien ne vient à l'appel. Quelqu'un peut-il me dire ce que je fais de mal dans mon code?
EXTJS code:
var fileName = Ext.getCmp("fileName").getValue();
Ext.Ajax.request({
url : 'UploadServlet',
method: 'POST',
headers: {'Content-Type': 'multipart/form-data'},
params :{
'fileName': fileName.trim()
},
success: function ( result, request ) {
resultData = result.responseText;
},
failure: function ( result, request ) {
resultData = result.responseText;
}
});
Servlet code:
protected void doPost(HttpServletRequest request,HttpServletResponse response)
throws ServletException, IOException {
.......
//Check that we have a file upload request
isMultipart = ServletFileUpload.isMultipartContent(request);
response.setContentType("text/html");
java.io.PrintWriter out = response.getWriter( );
if( !isMultipart ){
//display no file attached error
return;
}
//Create a factory for disk-based file items
DiskFileItemFactory factory = new DiskFileItemFactory();
//maximum size that will be stored in memory
factory.setSizeThreshold(maxMemSize);
//Location to save data that is larger than maxMemSize.
factory.setRepository(new File(tempDir));
//Create a new file upload handler
ServletFileUpload upload = new ServletFileUpload(factory);
//maximum file size to be uploaded.
upload.setSizeMax( maxFileSize );
try{
//Parse the request to get file items.
//////fileItems is empty,
////nothing is comming from extjs page/////////
List<FileItem> fileItems = upload.parseRequest(request);
//Process the uploaded file items
Iterator<FileItem> i = fileItems.iterator();
while ( i.hasNext () ) {
FileItem fi = (FileItem)i.next();
if ( !fi.isFormField () ) {
//Get the uploaded file parameters
String fieldName = fi.getFieldName();
String fileName = fi.getName();
String contentType = fi.getContentType();
boolean isInMemory = fi.isInMemory();
long sizeInBytes = fi.getSize();
//check if file exists
File propFile = new File(tempDir, fileName.substring( fileName.lastIndexOf("\\")));
if (!propFile.exists()) {
//Write the file
if( fileName.lastIndexOf("\\") >= 0 ){
file = new File(tempDir +
fileName.substring( fileName.lastIndexOf("\\"))) ;
}else{
file = new File( tempDir +
fileName.substring(fileName.lastIndexOf("\\")+1)) ;
}
//InputStream uploadedStream = fi.getInputStream();
fi.write( file ) ;
out.println("Uploaded Filename: " + fileName + " is in " + filePath + "<br>");
}
.....
}
}
OriginalL'auteur JS11 | 2013-06-11
Vous devez vous connecter pour publier un commentaire.
Vous ne pouvez pas télécharger un fichier avec l'AJAX.
Ext
Ajax
peut l'émuler. Voir la doc dedemande
méthode. Vous devez utiliser leform
etisUpload
options.Cependant, puisque vous avez à utiliser une forme de toute façon, vous devriez regarder
Ext.forme.champ.Champ
(et, comme expliqué dans la doc, àExt.forme.De base.hasUpload
; cela vous donnera une meilleure compréhension de l'upload de fichier problématique).EDIT: En fait, HTML5 et XMLHttpRequest Niveau 2 ajoute le support pour le téléchargement de fichiers. Ne pas changer la façon dont vous avez à gérer cela en Ext.
OriginalL'auteur rixo