Java 使用servlet上传文件GWT
我正在用GWT开发一个应用程序,并尝试将文件上载到服务器(或目录)。我正在使用一个表单,通过FileUpload小部件提交所选文件。我在上传文件时使用的servlet有问题:Java 使用servlet上传文件GWT,java,gwt,servlets,file-upload,Java,Gwt,Servlets,File Upload,我正在用GWT开发一个应用程序,并尝试将文件上载到服务器(或目录)。我正在使用一个表单,通过FileUpload小部件提交所选文件。我在上传文件时使用的servlet有问题: package com.asso.server; import java.io.File; import java.io.IOException; import java.util.List; import javax.servlet.ServletException; import javax.servlet.htt
package com.asso.server;
import java.io.File;
import java.io.IOException;
import java.util.List;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileItemFactory;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
import org.apache.commons.io.FilenameUtils;
/**
* servlet to handle file upload requests
*
* @author hturksoy
*
*/
public class FileUploadServlet extends HttpServlet {
private static final String UPLOAD_DIRECTORY = "c:\\uploaded\\";
private static final String DEFAULT_TEMP_DIR = ".";
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
// TODO Auto-generated method stub
super.doGet(req, resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
// process only multipart requests
if (ServletFileUpload.isMultipartContent(req)) {
File tempDir = getTempDir();
if (!tempDir.exists()) {
tempDir.mkdirs();
}
// Create a factory for disk-based file items
FileItemFactory factory = new DiskFileItemFactory();
// Create a new file upload handler
ServletFileUpload upload = new ServletFileUpload(factory);
// Parse the request
try {
List<FileItem> items = upload.parseRequest(req);
for (FileItem fileItem : items) {
// process only file upload
if (fileItem.isFormField()) continue;
String fileName = fileItem.getName();
// get only the file name not whole path
if (fileName != null) {
fileName = FilenameUtils. getName(fileName);
}
File uploadedFile = new File(UPLOAD_DIRECTORY, fileName);
if (uploadedFile.createNewFile()) {
fileItem.write(uploadedFile);
resp.setStatus(HttpServletResponse.SC_CREATED);
resp.getWriter().print("The file was created successfully.");
resp.flushBuffer();
} else
throw new IOException("The file already exists in repository.");
}
} catch (Exception e) {
resp.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR,
"An error occurred while creating the file : " + e.getMessage());
}
} else {
resp.sendError(HttpServletResponse.SC_UNSUPPORTED_MEDIA_TYPE,
"Request contents type is not supported by the servlet.");
}
}
private File getTempDir() {
return new File(DEFAULT_TEMP_DIR);
}
}
我看到这个主题,它说我应该添加commons-fileupload-1.3.jar
和commons-io-2.4.jar
,我已经做了。
有解决办法吗?
编辑:
在将JAR直接添加到WEB-INF/lib之后,我遇到了这个错误
java.lang.NoClassDefFoundError: `java.io.FileOutputStream is a restricted class. Please see the Google App Engine developer's guide for more details.
at com.google.appengine.tools.development.agent.runtime.Runtime.reject(Runtime.java:51)
at org.apache.commons.io.output.DeferredFileOutputStream.thresholdReached(DeferredFileOutputStream.java:178)
at org.apache.commons.io.output.ThresholdingOutputStream.checkThreshold(ThresholdingOutputStream.java:224)
at org.apache.commons.io.output.ThresholdingOutputStream.write(ThresholdingOutputStream.java:128)
at org.apache.commons.fileupload.util.Streams.copy(Streams.java:108)
at org.apache.commons.fileupload.util.Streams.copy(Streams.java:70)
at org.apache.commons.fileupload.FileUploadBase.parseRequest(FileUploadBase.java:347)
at org.apache.commons.fileupload.servlet.ServletFileUpload.parseRequest(ServletFileUpload.java:115)
at com.asso.server.FileUploadServlet.doPost(FileUploadServlet.java:56)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:637)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
at org.mortbay.jetty.servlet.ServletHolder.handle(ServletHolder.java:511)
at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1166)
at com.google.appengine.api.socket.dev.DevSocketFilter.doFilter(DevSocketFilter.java:74)
at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
at com.google.appengine.tools.development.ResponseRewriterFilter.doFilter(ResponseRewriterFilter.java:123)
at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
at com.google.appengine.tools.development.HeaderVerificationFilter.doFilter(HeaderVerificationFilter.java:34)
at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
at com.google.appengine.api.blobstore.dev.ServeBlobFilter.doFilter(ServeBlobFilter.java:61)
at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
at com.google.apphosting.utils.servlet.TransactionCleanupFilter.doFilter(TransactionCleanupFilter.java:43)
at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
at com.google.appengine.tools.development.StaticFileFilter.doFilter(StaticFileFilter.java:125)
at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
at com.google.appengine.tools.development.DevAppServerServersFilter.doFilter(DevAppServerServersFilter.java:106)
at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
at org.mortbay.jetty.servlet.ServletHandler.handle(ServletHandler.java:388)
at org.mortbay.jetty.security.SecurityHandler.handle(SecurityHandler.java:216)
at org.mortbay.jetty.servlet.SessionHandler.handle(SessionHandler.java:182)
at org.mortbay.jetty.handler.ContextHandler.handle(ContextHandler.java:765)
at org.mortbay.jetty.webapp.WebAppContext.handle(WebAppContext.java:418)
at com.google.appengine.tools.development.DevAppEngineWebAppContext.handle(DevAppEngineWebAppContext.java:94)
at org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:152)
at com.google.appengine.tools.development.JettyContainerService$ApiProxyHandler.handle(JettyContainerService.java:421)
at org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:152)
at org.mortbay.jetty.Server.handle(Server.java:326)
at org.mortbay.jetty.HttpConnection.handleRequest(HttpConnection.java:542)
at org.mortbay.jetty.HttpConnection$RequestHandler.content(HttpConnection.java:938)
at org.mortbay.jetty.HttpParser.parseNext(HttpParser.java:755)
at org.mortbay.jetty.HttpParser.parseAvailable(HttpParser.java:218)
at org.mortbay.jetty.HttpConnection.handle(HttpConnection.java:404)
at org.mortbay.io.nio.SelectChannelEndPoint.run(SelectChannelEndPoint.java:409)
at org.mortbay.thread.QueuedThreadPool$PoolThread.run(QueuedThreadPool.java:582)`
确保没有遗漏将commons-fileupload-1.3.jar和commons-io-2.4.jar文件复制到WEB-INF/lib中的步骤。您还应该检查devmode的启动类路径 示例-我在lib中添加了一个示例jar,可以通过我的启动配置看到相同的示例jar 更新-如果您正在使用GAE,请通读
谷歌应用程序引擎应用程序 您使用的DiskFileItemFactory对象尝试写入文件系统,因此会出现以下异常:
java.lang.NoClassDefFoundError: `java.io.FileOutputStream is a restricted class. Please see the Google App Engine developer's guide for more details.
以下是来自以下方面的解释:
此实现创建FileItem实例,这些实例保持
内存中的内容、较小项目的内容或上的临时文件中的内容
磁盘,用于较大的项目。大小阈值,超过该阈值内容将
存储在磁盘上,可配置,以及
将创建临时文件。如果未进行其他配置,则
默认配置值如下:大小阈值为10KB
解决方案:
您应该增加文件大小阈值。覆盖默认值。将其设置为要上载到servlet的最大文件大小
DiskFileItemFactory factory= new DiskFileItemFactory(5000000,null);
或
你重启服务器了吗?(关闭开发模式并重新启动而不是重启按钮)是的,我做了很多次!您是使用maven还是将apache JAR复制到WEB-INF/lib中?错误是在开发模式还是生产模式下发生的?我没有将它们复制到WEB-INF/lib,而是将它们添加为外部JAR。但是我在我的构建路径和类路径中有它们,避免将更新发布为答案!!!由于您正在尝试使用google app engine,您的查询可能会回答为“我没有更新”以回答“我更新了”,因为问题尚未解决,还有其他问题。您可以在下面的问题解决的地方查看答案,但是还有一个错误,谢谢您的帮助!
DiskFileItemFactory factory= new DiskFileItemFactory(5000000,null);
DiskFileItemFactory factory= new DiskFileItemFactory();
factory.setSizeThreshold(5000000);