java - Google App Engine - Java Servlet - 文件访问

标签 java google-app-engine servlets permissions

我正在尝试编写一个返回文件的 Servlet。最终目标是返回无法通过 URL 直接访问的文件。我开始使用仅打印 Hello World 的 GuestbookServlet,它是用我在此处找到的一些代码构建的。

我正在使用 App Engine SDK 1.7.5 和 Helios Service Release 2。

在 eclipse 中,我将文件放置在“war”路径中。

我使用的网址是:

http://localhost:8888/guestbook?gimme

这是我的代码:

package guestbook;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;

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

@SuppressWarnings("serial")
public class GuestbookServlet extends HttpServlet {

private String identifier = "gimme";

public void doGet(HttpServletRequest req, HttpServletResponse resp)
        throws IOException {
    String queryString = req.getQueryString();
    if (queryString != null && queryString.equals(identifier)) {

        // String filename = URLDecoder.decode(req.getPathInfo(), "UTF-8");
        String filename = "pic.png";
        File file = new File("/files/", filename);
        System.out.println("FILE: " + file);
        resp.setHeader("Content-Type",
                getServletContext().getMimeType(file.getName()));
        resp.setHeader("Content-Length", String.valueOf(file.length()));
        resp.setHeader("Content-Disposition",
                "inline; filename=\"" + file.getName() + "\"");

        BufferedInputStream input = null;
        BufferedOutputStream output = null;

        try {
            input = new BufferedInputStream(new FileInputStream(file));
            output = new BufferedOutputStream(resp.getOutputStream());

            byte[] buffer = new byte[8192];
            for (int length = 0; (length = input.read(buffer)) > 0;) {
                output.write(buffer, 0, length);
            }
        } finally {
            if (output != null)
                try {
                    output.close();
                } catch (IOException ignore) {
                }
            if (input != null)
                try {
                    input.close();
                } catch (IOException ignore) {
                }
        }

    } else {
        resp.getWriter().println("Invalid Request");
    }

}
}

这是我的错误:

Mar 7, 2013 9:12:33 PM com.google.apphosting.utils.jetty.JettyLogger warn
WARNING: /guestbook
java.security.AccessControlException: access denied (java.io.FilePermission \files\pic.png read)
    at java.security.AccessControlContext.checkPermission(Unknown Source)
    at java.security.AccessController.checkPermission(Unknown Source)
    at java.lang.SecurityManager.checkPermission(Unknown Source)
    at com.google.appengine.tools.development.DevAppServerFactory$CustomSecurityManager.checkPermission(DevAppServerFactory.java:289)
    at java.lang.SecurityManager.checkRead(Unknown Source)
    at java.io.File.length(Unknown Source)
    at guestbook.GuestbookServlet.doGet(GuestbookServlet.java:29)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:617)
    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.BackendServersFilter.doFilter(BackendServersFilter.java:97)
    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:409)
    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.headerComplete(HttpConnection.java:923)
    at org.mortbay.jetty.HttpParser.parseNext(HttpParser.java:547)
    at org.mortbay.jetty.HttpParser.parseAvailable(HttpParser.java:212)
    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)

最佳答案

您无法使用 java io 类访问文件,因为应用程序引擎禁用了 java io 库。所以如果你想读取一个文件,你必须把这个文件放入blob存储中,然后从那里读取它。

关于java - Google App Engine - Java Servlet - 文件访问,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15286097/

相关文章:

java - Eclipse 需要哪些 JAR 文件才能使用 JSTL,以便最终在 GAE/J 上运行?

java - 使用 RallyRest API 从拉力赛中提取的车队容量与 CAAC 中显示的数字不匹配

python - 如何在 GAE 中使用 python 的缓存控制?

php - 使用 Mandrill 发送电子邮件模板出现错误

html - Servlet返回“HTTP状态404请求的资源(/Servlet)不可用”

grails - 在 web.xml 中配置 grails 时访问第二个 servlet

java - jsontostructs 到 spark 结构化流中的行

java - Java 中的对象创建语句不允许使用单行循环。为什么?

java - 如果我打算覆盖所有方法,使用继承是不是不好的做法?

python - 使用 Tweepy 搜索 Twitter 源