Glassfish 服务器上的 Apache Commons FileUpload 问题

发布于 2024-07-26 09:36:18 字数 10529 浏览 7 评论 0原文

我有一个简单的 Web 应用程序,它只有一个 Servlet,它接受数据文件并将其保存到服务器。 我正在使用“apache commons FileUpload”库。 文件上传在我的本地服务器上运行良好(我在开发和生产服务器上使用 Glassfish)。 我可以上传任何大小的文件。 这是我的内存信息:

-XX:MaxPermSize=512m
-Xmx1024m

这是我的 servlet 的代码:

...
public void doPost(HttpServletRequest request, HttpServletResponse response)  throws ServletException, IOException {
    log.info("Let's try to do something with your request");
    getMultipartRequestFile(request);
}

// Handling uploaded file with commons-fileupload library
private void getMultipartRequestFile(HttpServletRequest request){

    if(!ServletFileUpload.isMultipartContent(request))          // if not is multi part then exit this function
        return;

    FileItemFactory factory = new DiskFileItemFactory();        // Create a factory for file items
    ServletFileUpload upload = new ServletFileUpload(factory);  // Create a new file upload handler

    //Create a progress listener
    ProgressListener progressListener = new ProgressListener(){
        private long megaBytes = -1;
           public void update(long pBytesRead, long pContentLength, int pItems) {
               long mBytes = pBytesRead / 1000000;
               if (megaBytes == mBytes) {
                   return;
               }
               megaBytes = mBytes;
               if (pContentLength == -1) {
                   log.info("So far, " + dec.format(pBytesRead/1024.0/1024.0) + " have been read.");
               } else {
                   log.info("So far, " + dec.format(pBytesRead/1024.0/1024.0) + "\tof " + dec.format(pContentLength/1024.0/1024.0));
               }
           }
    };
    upload.setProgressListener(progressListener);

    // Parse the request
    try {
        List items = upload.parseRequest(request);

        // Process the uploaded items
        Iterator iter = items.iterator();
        while (iter.hasNext()) {
            FileItem item = (FileItem) iter.next();

            if (item.isFormField()) {
                processFormField(item);
            } else {
                processUploadedFile(item);
            }
        }
    } 
    catch (FileUploadException e) {
        e.printStackTrace();
    }
}

// this is where all magic with the file will happen
private void processUploadedFile(FileItem item){

    if (!item.isFormField()) {

        String fieldName = item.getFieldName();
        String fileName = item.getName();
        String contentType = item.getContentType();
        boolean isInMemory = item.isInMemory();
        long sizeInBytes = item.getSize();

        log.info("Field name: " + fieldName + "\nFile Name: " + fileName + "\nContent type: " +contentType+ "\nSize: " + dec.format(sizeInBytes/1024.0/1024.0));

        // write uploaded file to hdd
        File uploadedFile = new File(FILES_FOLDER + fileName);  

        try {
            item.write(uploadedFile);           
            log.info("File location: " + FILES_FOLDER + fileName);

        } catch (Exception e) {
            log.warning("File cannot be writtet to the disc");
            e.printStackTrace();
        }
    }
}
...

这是带有错误的输出:

[#|2009-07-13T22:19:31.822+0000|INFO|sun-appserver2.1|com.athena.video.upload.server.Fileuploader|_ThreadID=18;_ThreadName=httpSSLWorkerThread-8080-0;|Let's try to do something with 
your request|#]

[#|2009-07-13T22:19:31.823+0000|INFO|sun-appserver2.1|com.athena.video.upload.server.Fileuploader|_ThreadID=18;_ThreadName=httpSSLWorkerThread-8080-0;|So far, 0.00 mb  of 87.64 mb|#]

[#|2009-07-13T22:19:33.403+0000|INFO|sun-appserver2.1|com.athena.video.upload.server.Fileuploader|_ThreadID=18;_ThreadName=httpSSLWorkerThread-8080-0;|So far, 0.95 mb  of 87.64 mb|#]

[#|2009-07-13T22:19:34.109+0000|INFO|sun-appserver2.1|com.athena.video.upload.server.Fileuploader|_ThreadID=18;_ThreadName=httpSSLWorkerThread-8080-0;|So far, 1.91 mb  of 87.64 mb|#]

[#|2009-07-13T22:19:34.739+0000|INFO|sun-appserver2.1|com.athena.video.upload.server.Fileuploader|_ThreadID=18;_ThreadName=httpSSLWorkerThread-8080-0;|So far, 2.86 mb  of 87.64 mb|#]

[#|2009-07-13T22:19:35.371+0000|INFO|sun-appserver2.1|com.athena.video.upload.server.Fileuploader|_ThreadID=18;_ThreadName=httpSSLWorkerThread-8080-0;|So far, 3.82 mb  of 87.64 mb|#]

[#|2009-07-13T22:19:35.989+0000|INFO|sun-appserver2.1|com.athena.video.upload.server.Fileuploader|_ThreadID=18;_ThreadName=httpSSLWorkerThread-8080-0;|So far, 4.77 mb  of 87.64 mb|#]

[#|2009-07-13T22:19:36.938+0000|WARNING|sun-appserver2.1|javax.enterprise.system.stream.err|_ThreadID=18;_ThreadName=httpSSLWorkerThread-8080-0;_RequestID=99b72ec5-047c-4a86-9160-994ea31848a2;|org.apache.commons.fileupload.FileUploadBase$IOFileUploadException: Processing of multipart/form-data request failed. Stream ended unexpectedly
        at org.apache.commons.fileupload.FileUploadBase.parseRequest(FileUploadBase.java:367)
        at org.apache.commons.fileupload.servlet.ServletFileUpload.parseRequest(ServletFileUpload.java:126)
        at com.athena.video.upload.server.Fileuploader.getMultipartRequestFile(Fileuploader.java:109)
        at com.athena.video.upload.server.Fileuploader.doPost(Fileuploader.java:47)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:754)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:847)
        at org.apache.catalina.core.ApplicationFilterChain.servletService(ApplicationFilterChain.java:427)
        at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:315)
        at org.apache.catalina.core.StandardContextValve.invokeInternal(StandardContextValve.java:287)
        at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:218)
        at org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:648)
        at org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:593)
        at com.sun.enterprise.web.WebPipeline.invoke(WebPipeline.java:94)
        at com.sun.enterprise.web.PESessionLockingStandardPipeline.invoke(PESessionLockingStandardPipeline.java:98)
        at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:222)
        at org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:648)
        at org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:593)
        at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:587)
        at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:1096)
        at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:166)
        at org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:648)
        at org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:593)
        at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:587)
        at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:1096)
        at org.apache.coyote.tomcat5.CoyoteAdapter.service(CoyoteAdapter.java:288)
        at com.sun.enterprise.web.connector.grizzly.DefaultProcessorTask.invokeAdapter(DefaultProcessorTask.java:647)
        at com.sun.enterprise.web.connector.grizzly.DefaultProcessorTask.doProcess(DefaultProcessorTask.java:579)
        at com.sun.enterprise.web.connector.grizzly.DefaultProcessorTask.process(DefaultProcessorTask.java:831)
        at com.sun.enterprise.web.connector.grizzly.DefaultReadTask.executeProcessorTask(DefaultReadTask.java:341)
        at com.sun.enterprise.web.connector.grizzly.DefaultReadTask.doTask(DefaultReadTask.java:263)
        at com.sun.enterprise.web.connector.grizzly.DefaultReadTask.doTask(DefaultReadTask.java:214)
        at com.sun.enterprise.web.portunif.PortUnificationPipeline$PUTask.doTask(PortUnificationPipeline.java:380)
        at com.sun.enterprise.web.connector.grizzly.TaskBase.run(TaskBase.java:265)
        at com.sun.enterprise.web.connector.grizzly.ssl.SSLWorkerThread.run(SSLWorkerThread.java:106)
Caused by: org.apache.commons.fileupload.MultipartStream$MalformedStreamException: Stream ended unexpectedly
        at org.apache.commons.fileupload.MultipartStream$ItemInputStream.makeAvailable(MultipartStream.java:983)
        at org.apache.commons.fileupload.MultipartStream$ItemInputStream.read(MultipartStream.java:887)
        at java.io.InputStream.read(InputStream.java:85)
        at org.apache.commons.fileupload.util.Streams.copy(Streams.java:94)
        at org.apache.commons.fileupload.util.Streams.copy(Streams.java:64)
        at org.apache.commons.fileupload.FileUploadBase.parseRequest(FileUploadBase.java:362)
        ... 33 more
|#]

[#|2009-07-13T22:19:37.839+0000|SEVERE|sun-appserver2.1|javax.enterprise.system.container.web|_ThreadID=19;_ThreadName=httpSSLWorkerThread-8080-1;_RequestID=528b60b2-7083-4f27-a1de-0c90df2a34f1;|WEB0777: Unblocking keep-alive exception
java.lang.IllegalStateException: PWC4662: Request header is too large
        at org.apache.coyote.http11.InternalInputBuffer.fill(InternalInputBuffer.java:740)
        at org.apache.coyote.http11.InternalInputBuffer.parseRequestLine(InternalInputBuffer.java:442)
        at com.sun.enterprise.web.connector.grizzly.DefaultProcessorTask.parseRequest(DefaultProcessorTask.java:694)
        at com.sun.enterprise.web.connector.grizzly.DefaultProcessorTask.doProcess(DefaultProcessorTask.java:577)
        at com.sun.enterprise.web.connector.grizzly.DefaultProcessorTask.process(DefaultProcessorTask.java:831)
        at com.sun.enterprise.web.connector.grizzly.DefaultReadTask.executeProcessorTask(DefaultReadTask.java:341)
        at com.sun.enterprise.web.connector.grizzly.DefaultReadTask.doTask(DefaultReadTask.java:263)
        at com.sun.enterprise.web.connector.grizzly.DefaultReadTask.doTask(DefaultReadTask.java:214)
        at com.sun.enterprise.web.connector.grizzly.TaskBase.run(TaskBase.java:265)

这是我还尝试添加到我的 domain.xml 中的内容:

<http-listener acceptor-threads="1" address="0.0.0.0" blocking-enabled="false" default-virtual-server="server" enabled="true" family="inet" id="http-listener-1" port="8080" security-enabled="false" server-name="" xpowered-by="true">
          <property name="maxPostSize" value="0"/> <!-- 0 means no max -->
          <property name="proxiedProtocols" value="ws/tcp"/>
</http-listener>

知道为什么会发生这种情况吗

I have simple web app that just has one Servlet that accepts data file and saves it to the server. I'm using "apache commons FileUpload" library. File uploading work fine on my local server (I'm using Glassfish for my Dev and Prod server). I can upload any size files. Here is my memory info:

-XX:MaxPermSize=512m
-Xmx1024m

Here is the code for my servlet:

...
public void doPost(HttpServletRequest request, HttpServletResponse response)  throws ServletException, IOException {
    log.info("Let's try to do something with your request");
    getMultipartRequestFile(request);
}

// Handling uploaded file with commons-fileupload library
private void getMultipartRequestFile(HttpServletRequest request){

    if(!ServletFileUpload.isMultipartContent(request))          // if not is multi part then exit this function
        return;

    FileItemFactory factory = new DiskFileItemFactory();        // Create a factory for file items
    ServletFileUpload upload = new ServletFileUpload(factory);  // Create a new file upload handler

    //Create a progress listener
    ProgressListener progressListener = new ProgressListener(){
        private long megaBytes = -1;
           public void update(long pBytesRead, long pContentLength, int pItems) {
               long mBytes = pBytesRead / 1000000;
               if (megaBytes == mBytes) {
                   return;
               }
               megaBytes = mBytes;
               if (pContentLength == -1) {
                   log.info("So far, " + dec.format(pBytesRead/1024.0/1024.0) + " have been read.");
               } else {
                   log.info("So far, " + dec.format(pBytesRead/1024.0/1024.0) + "\tof " + dec.format(pContentLength/1024.0/1024.0));
               }
           }
    };
    upload.setProgressListener(progressListener);

    // Parse the request
    try {
        List items = upload.parseRequest(request);

        // Process the uploaded items
        Iterator iter = items.iterator();
        while (iter.hasNext()) {
            FileItem item = (FileItem) iter.next();

            if (item.isFormField()) {
                processFormField(item);
            } else {
                processUploadedFile(item);
            }
        }
    } 
    catch (FileUploadException e) {
        e.printStackTrace();
    }
}

// this is where all magic with the file will happen
private void processUploadedFile(FileItem item){

    if (!item.isFormField()) {

        String fieldName = item.getFieldName();
        String fileName = item.getName();
        String contentType = item.getContentType();
        boolean isInMemory = item.isInMemory();
        long sizeInBytes = item.getSize();

        log.info("Field name: " + fieldName + "\nFile Name: " + fileName + "\nContent type: " +contentType+ "\nSize: " + dec.format(sizeInBytes/1024.0/1024.0));

        // write uploaded file to hdd
        File uploadedFile = new File(FILES_FOLDER + fileName);  

        try {
            item.write(uploadedFile);           
            log.info("File location: " + FILES_FOLDER + fileName);

        } catch (Exception e) {
            log.warning("File cannot be writtet to the disc");
            e.printStackTrace();
        }
    }
}
...

And this is output with Error:

[#|2009-07-13T22:19:31.822+0000|INFO|sun-appserver2.1|com.athena.video.upload.server.Fileuploader|_ThreadID=18;_ThreadName=httpSSLWorkerThread-8080-0;|Let's try to do something with 
your request|#]

[#|2009-07-13T22:19:31.823+0000|INFO|sun-appserver2.1|com.athena.video.upload.server.Fileuploader|_ThreadID=18;_ThreadName=httpSSLWorkerThread-8080-0;|So far, 0.00 mb  of 87.64 mb|#]

[#|2009-07-13T22:19:33.403+0000|INFO|sun-appserver2.1|com.athena.video.upload.server.Fileuploader|_ThreadID=18;_ThreadName=httpSSLWorkerThread-8080-0;|So far, 0.95 mb  of 87.64 mb|#]

[#|2009-07-13T22:19:34.109+0000|INFO|sun-appserver2.1|com.athena.video.upload.server.Fileuploader|_ThreadID=18;_ThreadName=httpSSLWorkerThread-8080-0;|So far, 1.91 mb  of 87.64 mb|#]

[#|2009-07-13T22:19:34.739+0000|INFO|sun-appserver2.1|com.athena.video.upload.server.Fileuploader|_ThreadID=18;_ThreadName=httpSSLWorkerThread-8080-0;|So far, 2.86 mb  of 87.64 mb|#]

[#|2009-07-13T22:19:35.371+0000|INFO|sun-appserver2.1|com.athena.video.upload.server.Fileuploader|_ThreadID=18;_ThreadName=httpSSLWorkerThread-8080-0;|So far, 3.82 mb  of 87.64 mb|#]

[#|2009-07-13T22:19:35.989+0000|INFO|sun-appserver2.1|com.athena.video.upload.server.Fileuploader|_ThreadID=18;_ThreadName=httpSSLWorkerThread-8080-0;|So far, 4.77 mb  of 87.64 mb|#]

[#|2009-07-13T22:19:36.938+0000|WARNING|sun-appserver2.1|javax.enterprise.system.stream.err|_ThreadID=18;_ThreadName=httpSSLWorkerThread-8080-0;_RequestID=99b72ec5-047c-4a86-9160-994ea31848a2;|org.apache.commons.fileupload.FileUploadBase$IOFileUploadException: Processing of multipart/form-data request failed. Stream ended unexpectedly
        at org.apache.commons.fileupload.FileUploadBase.parseRequest(FileUploadBase.java:367)
        at org.apache.commons.fileupload.servlet.ServletFileUpload.parseRequest(ServletFileUpload.java:126)
        at com.athena.video.upload.server.Fileuploader.getMultipartRequestFile(Fileuploader.java:109)
        at com.athena.video.upload.server.Fileuploader.doPost(Fileuploader.java:47)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:754)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:847)
        at org.apache.catalina.core.ApplicationFilterChain.servletService(ApplicationFilterChain.java:427)
        at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:315)
        at org.apache.catalina.core.StandardContextValve.invokeInternal(StandardContextValve.java:287)
        at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:218)
        at org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:648)
        at org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:593)
        at com.sun.enterprise.web.WebPipeline.invoke(WebPipeline.java:94)
        at com.sun.enterprise.web.PESessionLockingStandardPipeline.invoke(PESessionLockingStandardPipeline.java:98)
        at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:222)
        at org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:648)
        at org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:593)
        at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:587)
        at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:1096)
        at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:166)
        at org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:648)
        at org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:593)
        at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:587)
        at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:1096)
        at org.apache.coyote.tomcat5.CoyoteAdapter.service(CoyoteAdapter.java:288)
        at com.sun.enterprise.web.connector.grizzly.DefaultProcessorTask.invokeAdapter(DefaultProcessorTask.java:647)
        at com.sun.enterprise.web.connector.grizzly.DefaultProcessorTask.doProcess(DefaultProcessorTask.java:579)
        at com.sun.enterprise.web.connector.grizzly.DefaultProcessorTask.process(DefaultProcessorTask.java:831)
        at com.sun.enterprise.web.connector.grizzly.DefaultReadTask.executeProcessorTask(DefaultReadTask.java:341)
        at com.sun.enterprise.web.connector.grizzly.DefaultReadTask.doTask(DefaultReadTask.java:263)
        at com.sun.enterprise.web.connector.grizzly.DefaultReadTask.doTask(DefaultReadTask.java:214)
        at com.sun.enterprise.web.portunif.PortUnificationPipeline$PUTask.doTask(PortUnificationPipeline.java:380)
        at com.sun.enterprise.web.connector.grizzly.TaskBase.run(TaskBase.java:265)
        at com.sun.enterprise.web.connector.grizzly.ssl.SSLWorkerThread.run(SSLWorkerThread.java:106)
Caused by: org.apache.commons.fileupload.MultipartStream$MalformedStreamException: Stream ended unexpectedly
        at org.apache.commons.fileupload.MultipartStream$ItemInputStream.makeAvailable(MultipartStream.java:983)
        at org.apache.commons.fileupload.MultipartStream$ItemInputStream.read(MultipartStream.java:887)
        at java.io.InputStream.read(InputStream.java:85)
        at org.apache.commons.fileupload.util.Streams.copy(Streams.java:94)
        at org.apache.commons.fileupload.util.Streams.copy(Streams.java:64)
        at org.apache.commons.fileupload.FileUploadBase.parseRequest(FileUploadBase.java:362)
        ... 33 more
|#]

[#|2009-07-13T22:19:37.839+0000|SEVERE|sun-appserver2.1|javax.enterprise.system.container.web|_ThreadID=19;_ThreadName=httpSSLWorkerThread-8080-1;_RequestID=528b60b2-7083-4f27-a1de-0c90df2a34f1;|WEB0777: Unblocking keep-alive exception
java.lang.IllegalStateException: PWC4662: Request header is too large
        at org.apache.coyote.http11.InternalInputBuffer.fill(InternalInputBuffer.java:740)
        at org.apache.coyote.http11.InternalInputBuffer.parseRequestLine(InternalInputBuffer.java:442)
        at com.sun.enterprise.web.connector.grizzly.DefaultProcessorTask.parseRequest(DefaultProcessorTask.java:694)
        at com.sun.enterprise.web.connector.grizzly.DefaultProcessorTask.doProcess(DefaultProcessorTask.java:577)
        at com.sun.enterprise.web.connector.grizzly.DefaultProcessorTask.process(DefaultProcessorTask.java:831)
        at com.sun.enterprise.web.connector.grizzly.DefaultReadTask.executeProcessorTask(DefaultReadTask.java:341)
        at com.sun.enterprise.web.connector.grizzly.DefaultReadTask.doTask(DefaultReadTask.java:263)
        at com.sun.enterprise.web.connector.grizzly.DefaultReadTask.doTask(DefaultReadTask.java:214)
        at com.sun.enterprise.web.connector.grizzly.TaskBase.run(TaskBase.java:265)

Here is what I also tried to add to my domain.xml:

<http-listener acceptor-threads="1" address="0.0.0.0" blocking-enabled="false" default-virtual-server="server" enabled="true" family="inet" id="http-listener-1" port="8080" security-enabled="false" server-name="" xpowered-by="true">
          <property name="maxPostSize" value="0"/> <!-- 0 means no max -->
          <property name="proxiedProtocols" value="ws/tcp"/>
</http-listener>

Any idea why this is happening

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

静待花开 2024-08-02 09:36:19
java.lang.IllegalStateException: PWC4662: Request header is too large

您需要配置 HTTP 连接器以使用更大的缓冲区。

HTTP监听器的设置中应该有一个参数“maxPostSize”。

java.lang.IllegalStateException: PWC4662: Request header is too large

You need to configure the HTTP connector to use a larger buffer.

There should be a parameter "maxPostSize" in the settings of the HTTP listener.

鲜血染红嫁衣 2024-08-02 09:36:19

我只能推测。 您在两台服务器上使用相同版本的库/容器吗? 您能否嗅探您的文件上传(使用 apache 工具 - 不记得名称)并检查它是否正确上传? 您可以手动抓取 servlet 中上传的正文,并检查 servlet 过滤器/默认请求解析器是否没有损坏?

我还发现了这个问题。 基本上它表明上传过程中套接字超时导致了异常。

I can only speculate. Do you use the same version of the library/container on both servers? Could you sniff your file upload (using an apache tool - can't remember the name) and check if it gets uploaded properly? You could manually grab the uploaded body in the servlet and check if there is no corruption from a servlet filter/default request parser?

I also found a this issue here. Basically it states that socket timeout during the upload caused the exception.

行雁书 2024-08-02 09:36:18

检查两者上 glassfish 服务器的版本。 我遇到了同样的问题,并发现 apache commons 文件上传在 glassfish 服务器 3.1.2 上有问题。 当我升级到服务器版本 3.1.2.2(构建 5)时,文件上传功能工作正常。

请参考以下问题http://java.net/jira/browse/GLASSFISH-18444

Check the version of the glassfish server on the both. I had the same issue and figured out that apache commons file upload has issues on glassfish server 3.1.2. When i upgraded to server version 3.1.2.2 (build 5), the file upload functionality works fine.

Please refer the following issue http://java.net/jira/browse/GLASSFISH-18444

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文