簡體   English   中英

解析HTTP POST請求

[英]Parsing an HTTP POST request

目標

我正在嘗試解析HTTP POST請求,以檢索使用HTML表單發送的文件。

形式如下:

<form action="http://127.0.0.1:8081" method="post" enctype="multipart/form-data">
    <input type="file" name="file" id="fileControl" />
    <input type="submit" />
</form>

怎么樣

作為POST請求,與此類似:

POST <URL> HTTP/1.1
<HEADERS>
[BLANK LINE]
---------<BOUNDARY>
<HEADERS>
[BLANK LINE]
<file content>
-----------<BOUNDARY>

我認為解析套接字上收到的內容很重要。

首先 ,我讀到直到文件開頭

BufferedReader in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
in.readLine();

然后 ,要保存文件,這就是我想要做的:

FileOutputStream outputStream = new FileOutputStream(new File("/tmp/test"));

while ((read = clientSocket.getInputStream().read(bytes)) != -1) {
    outputStream.write(bytes, 0, read);
    outputStream.flush();
}

問題

問題是我不再讀取BufferedReader,並且在read = clientSocket.getInputStream().read(bytes)沒有任何內容

問題

如何保存通過POST請求發送的文件? 我不想使用任何Web服務器,也不想使用任何庫/框架,而只使用純Java。 如果不清楚,我將編輯這篇文章。 提前致謝。

public HttpRequest init_request(String request_str) {
    try {
        SessionInputBufferImpl sessionInputBuffer = new SessionInputBufferImpl(new HttpTransportMetricsImpl(), 2048);
        sessionInputBuffer.bind(new ByteArrayInputStream(request_str.getBytes(Consts.ASCII)));
        DefaultHttpRequestParser requestParser = new DefaultHttpRequestParser(sessionInputBuffer);
        HttpRequest request = requestParser.parse();

        // Solve post request entity bug (always returns null)
        if(request instanceof HttpEntityEnclosingRequest){
            HttpEntityEnclosingRequest ereq = (HttpEntityEnclosingRequest) request;

            ContentLengthStrategy contentLengthStrategy = StrictContentLengthStrategy.INSTANCE;
            long len = contentLengthStrategy.determineLength(request);
            InputStream contentStream = null;
            if (len == ContentLengthStrategy.CHUNKED) {
                contentStream = new ChunkedInputStream(sessionInputBuffer);
            } else if (len == ContentLengthStrategy.IDENTITY) {
                contentStream = new IdentityInputStream(sessionInputBuffer);
            } else {
                contentStream = new ContentLengthInputStream(sessionInputBuffer, len);
            }
            BasicHttpEntity ent = new BasicHttpEntity();
            ent.setContent(contentStream);
            ereq.setEntity(ent);
        }

        return request;
    } catch (Exception e) {
        SLogger.error("Unable to parse request", e);
        return null;
    }
}

使用Apache的httpcomponets / httpclient庫生成並發送發布請求。 任何其他事情都是徒勞無益的。

參見https://hc.apache.org/httpcomponents-client-ga/quickstart.html

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM