Upload funkioniert nicht mehr mit Firefox

takidoso

Erfahrenes Mitglied
Hallo und Halli,
Ich bastele a einer dynamischen Web-Anwendung. Der teil der zum Hocladen von Dateien war funktionierte ganz hervorraged sowohl in IE als auch in FrieFox.
Folgende HTML-Seite ist gemeint
HTML:
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"><html><head></head><body><form enctype="multipart/form-data" method="post" action="/CMKRisikoWeb/UploadImageServlet"><fieldset><table><tbody><tr><td></td><td></td><td></td></tr><tr><td>
      Bild:
    </td><td><input id="file" type="file" name="file"></input></td><td></td></tr><tr></tr></tbody></table></fieldset></form></body></html>
Seit neueem funktioniet es nicht mehr auf FireFox (vewende z.Z.. Vesion 20.0.
Symptom:
FireFox öffnet ständig den Dateisuchdialog wenn man ins Textfeld focussiert und au fEnter drückt.
Kan es sein, das man irgend eine FireFox einstellung vornehen muss?
Mit IE funktioniet es glücklicher weise noch, abe eigentlich dachte ich das es in allen gängigen Browsern laufen müsste.
(vewendetes Betriebssystem is Windows 7)

Für Hiweise dankbare Grüße

Takidoso
 
Jo stimmt ...
Ich habe daher neulich mal in dem Mozilla-Bug-Forum nachgefragt.
Es gab da einiges hin und her, und wir kamen zu dem Schluss, dann doch noch mindestens einen Submit-Button in die Form einubringen und entsprechend im Servlet-Teil den Kram abzufragen.

Hier meine Lösung
HTML:
<jsp:useBean
  id="user"
  class="de.cmk.web.bean.User"
  scope="session"
/>
<jsp:setProperty
  name="user"
  property="*"
/>

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

<html>
	<form
	  action="<%=response.encodeURL(request.getContextPath()+"/UploadImageServlet")%>"
	  method="post"
	  enctype="multipart/form-data"
	>

			<fieldset>
				<table>
					<tr>
    				<td>Benutzer:</label></td>
    				<td><%=user.getName()%></td>
    				<td><%="<img src=user-images/"+user.getImageName()+ " width=\"30%\" height=\"30%\">"%></td>
  				</tr>
				  <tr>
				    <td>Bild:</td>
				    <td><input
				      type="file"
				      name="file"
				      id="file"
				    >
				    <td>
				  </tr>
				  <tr>
				  
				</table>
				
                <input id="upload-button" name="upload.submit.button" type="submit" value="hochaden" class="submit" title="zum Bestätigung des Hochladens"/>
                <input id="cancel-button" name="cancel.submit.button" type="submit" value="Abbrechen" class="submit" title="zurück zur Hauptseite"/>
			</fieldset>
	</form>
</html>
und hier mein Sevlet zum hochladen selbst:
Java:
package de.cmk.risiko.server;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.nio.channels.Channels;
import java.nio.channels.ReadableByteChannel;
import java.nio.channels.WritableByteChannel;
import java.sql.SQLException;

import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.commons.fileupload.FileItemIterator;
import org.apache.commons.fileupload.FileItemStream;
import org.apache.commons.fileupload.FileUploadException;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
import org.apache.commons.fileupload.util.Streams;
import org.apache.log4j.Logger;

import de.cmk.nio.ChannelTools;
import de.cmk.util.FileUtils;
import de.cmk.web.bean.User;

public class UploadImageServlet extends HttpServlet implements AttributeNames
{
	static private   Logger     logger       = Logger.getLogger(UploadImageServlet.class);
	
	private String generateImageName(User user, String originalPath)
	{
		String imageName =  user.getName()+"_"+new File (originalPath).getName();
		
		if (imageName.length()>100)
		{
			int    extIdx = imageName.lastIndexOf('.');
			String extStr = imageName.substring(extIdx, imageName.length());
			
			imageName = imageName.substring(0, 100-extStr.length())+extStr;
		}
		
		
		return imageName;
	}
	
	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException
	{
		doPost(req, resp);
	}
	
	public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
	{
		//PrintWriter out = response.getWriter();
		boolean isMultipart = ServletFileUpload.isMultipartContent(request);
		logger.debug("request: " + request);
		
		User user = (User)request.getSession().getAttribute(ATTR_USER);

		if (user==null)
		{
			logger.warn("No User is logged in");
			RequestDispatcher rd = request.getRequestDispatcher("index.jsp"+"?msg=please log in");
			rd.forward(request, response);
		}
		else if (!isMultipart)
		{
			logger.warn("File was not uploaded, since it is not a multipart request");
		}
		else
		{
			WritableByteChannel oChan   = null;
			ServletFileUpload   upload  = new ServletFileUpload();
			InputStream         iStream = null;
			try
			{
				FileItemIterator iter          = upload.getItemIterator(request);
				String           imageFileName = null;
				String           originalFName = null;
				File             imageDir      = new File(getServletContext().getRealPath("/user-images/") );
				boolean          isCanceld     = false;

				FileUtils.ensureDirectory(imageDir, true, true, true);

				logger.debug("imageDir ='"+imageDir+"'");
				
				for (int i=1; iter.hasNext(); i++)
				{
					FileItemStream item    = iter.next();
					String         name    = item.getFieldName();
					iStream                = item.openStream();
					
					if (item.isFormField())
					{
						System.out.println("Form field " + name + " with value " + Streams.asString(iStream) + " detected.");
						isCanceld = name.equals("cancel.submit.button");
					}
					else
					{
						logger.debug("#"+i+". File field " + name + " with file name " + item.getName() + " detected.");
						ReadableByteChannel iChan = Channels.newChannel(iStream);
						if (imageFileName==null || !item.getName().equals(originalFName))
						{
							if (oChan!=null)
							{
								oChan.close();
							}
							imageFileName = generateImageName(user, item.getName());
							oChan         = Channels.newChannel(new FileOutputStream(new File(imageDir,imageFileName)));
							originalFName = item.getName();
						}
						
						ChannelTools.fastChannelCopy(iChan, oChan);
					}
				}
				
				if (isCanceld)
				{
					RequestDispatcher rd = request.getRequestDispatcher("index.jsp"+"?msg="+user.getName()+" has canceled uploading a picture");
					rd.forward(request, response);
				}
				else
				{
					user.updImage(new File(imageDir, imageFileName).toURI());
					request.getSession().setAttribute(ATTR_USER, user);
					RequestDispatcher rd = request.getRequestDispatcher("index.jsp"+"?msg="+user.getName()+" has uploaded a picture successfully");
					rd.forward(request, response);
				}
			}
			catch (FileUploadException e)
			{
				throw new IOException(e);
			}
			catch (SQLException sqlEx)
			{
				throw new IOException(sqlEx);
			}
			finally
			{
				iStream.close();
			}
		}

	}
}

Desweiteren habe ich nun sogar ein wiki von SelfHTML ausfindig machen können, in dem ich einen entsprechenden Hinweiskommentar hinterlies.
http://wiki.selfhtml.org/wiki/HTML/Formulare/Felder_Datei-Upload
 
Zurück