java - NanoHTTPD:使用 html 表单 (POST) 上传文件

标签 java html nanohttpd

我在 Java 桌面环境上使用 NanoHTTPD 网络服务器 2.1.0。 (没有安卓)

一切正常...但不是使用 POST 方法上传文件(表单不支持 PUT)

这是我的 HTML 代码:

<form method="post" enctype="multipart/form-data">
    choose a file<br>
    <input name="file" type="file" size="50" maxlength="100000"">
    <button type="submit">upload</button>
</form>

这是我的服务器方法:

public Response serve(IHTTPSession session) {
    if (session.getMethod() == Method.POST) {
        Map<String, String> files = new HashMap<String, String>();
        session.parseBody(files);
        //this prints {file=C:\path-to-java-tmp-files\NanoHTTPD-4635244586997909485}
        //the number is always different
        System.out.println(files.toString());
    } else {
        //page containing the index.html including the form
        return page;
    }
}

问题来了: 临时文件不存在。在现有的末尾还有另一个具有不同“编号”的临时文件,这似乎是正确的文件,因为内容与上传文件的内容相同。那么如何获得正确的临时文件名呢?

另一个问题是: 临时文件包含漏洞 POST 内容:

-----------------------------115801144322347
Content-Disposition: form-data; name="file"; filename="filename.txt"
Content-Type: application/octet-stream

-->content of the uploaded file


-----------------------------115801144322347--

如果内容是图片或二进制文件,这是一个问题。

NanoHTTPD 似乎没有对 POST 请求做任何特殊处理。它总是一样的...将请求保存到 tmp 文件并提供页面。 所以: - 如何获得正确的临时文件? --> 我认为这是一个错误。我得到了正确的路径和名称,但“数字”已损坏。 idk ...如果发生上传,我是否应该暂时更改 java tmp 路径,然后始终删除该文件。那么我只有一个独立于任何命名的 tmp 文件? - 如何从文件中删除 html 请求 header

或者我做错了什么?这是将文件上传到 nanohttpd 的正确方法吗?

谢谢你的帮助!

最佳答案

老问题!但我一直在寻找解决这个问题的方法。我在处理 IHTTPSession 输入流时遇到问题。事实证明,流在读取时会过早地变空,您必须返回以获取更多信息。这发生在我发送大于大约 500k 的 application/octet-stream 数据时(我没有分析确切的数字)。

我的解决方案是打开IHTTPSession 输入流,并迭代读取输入流直到完全耗尽:

public Response post_upload(IHTTPSession session) {   
    System.out.println("received HTTP post with upload body...");  
    int streamLength = Integer.parseInt(session.getHeaders().get("content-length"));
    System.out.println("Content length is: " + streamLength);
    byte[] fileContent = new byte[streamLength];
    try {
        InputStream input = session.getInputStream();
        int bytesRead = 0;
        int iterations = 0;
        while (bytesRead < streamLength) {              
            int thisRead = input.read(fileContent, bytesRead, streamLength-bytesRead);                
            bytesRead += thisRead;
            iterations++;
        }
        System.out.println("Read " + bytesRead + " bytes in " + iterations + " iterations.");
    }
    catch (Exception e) {
        System.out.println("We have other problems...");
    }
    return newFixedLengthResponse(Response.Status.OK, "application/json", "[\"no prob\"]");
}

希望对您有所帮助。

关于java - NanoHTTPD:使用 html 表单 (POST) 上传文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24867734/

相关文章:

javascript - 通过拖放复制文件

java - 从 nanoHttpd 服务器重定向到另一个域

java - 如何将图像从 android java 传递到 JNI 以使用 opencv 过滤图像并返回到 android java?

html - 使用我自己的搜索框创建样式化的仅结果谷歌自定义搜索

java - 无法将 void 转换为 java.lang.Void

html - 选项卡菜单中的 Bootstrap float div

java - 使用网络代理 (nanoHTTPD) 动态传输[随机访问]加密 (AES-CTR) 视频

java - NanoHTTPD 无法处理 POST 参数

java - Android 中的字符串下标和上标

java - 如何在http请求头中发送签名