Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/305.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用JavaURL类将数据写入服务器是否需要服务器响应?_Java_File Upload_Httpurlconnection - Fatal编程技术网

使用JavaURL类将数据写入服务器是否需要服务器响应?

使用JavaURL类将数据写入服务器是否需要服务器响应?,java,file-upload,httpurlconnection,Java,File Upload,Httpurlconnection,我试图使用JavaURL类上传文件,我发现了一个栈上溢出,它很好地解释了细节,所以我尝试遵循它。下面是我的代码,它来自于 我的问题是,如果我不调用connection.getResponseCode()或connection.getInputStream()或connection.getResponseMessage()或与服务器响应相关的任何东西,请求将永远不会发送到服务器。我为什么要这样做?或者有没有办法在没有得到响应的情况下写入数据 另外,我开发了一个服务器端上传servlet,它接受多部

我试图使用Java
URL
类上传文件,我发现了一个栈上溢出,它很好地解释了细节,所以我尝试遵循它。下面是我的代码,它来自于

我的问题是,如果我不调用
connection.getResponseCode()
connection.getInputStream()
connection.getResponseMessage()
或与服务器响应相关的任何东西,请求将永远不会发送到服务器。我为什么要这样做?或者有没有办法在没有得到响应的情况下写入数据

另外,我开发了一个服务器端上传servlet,它接受
多部分/表单数据
,并使用将其保存到文件中。它是稳定的,肯定没有任何问题,所以这不是我的问题产生的地方

import java.io.Closeable;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.HttpURLConnection;
import java.net.URL;
import org.apache.commons.io.IOUtils;

public class URLUploader {

    public static void closeQuietly(Closeable... objs) {
        for (Closeable closeable : objs) {
            IOUtils.closeQuietly(closeable);
        }
    }

    public static void main(String[] args) throws IOException {
        File textFile = new File("D:\\file.zip");
        String boundary = Long.toHexString(System.currentTimeMillis()); // Just generate some unique random value.

        HttpURLConnection connection = (HttpURLConnection) new URL("http://localhost:8080/upslet/upload").openConnection();
        connection.setDoOutput(true);
        connection.setRequestProperty("Content-Type", "multipart/form-data; boundary=" + boundary);
        OutputStream output = connection.getOutputStream();

        PrintWriter writer = new PrintWriter(output, true);
        // Send text file.
        writer.println("--" + boundary);
        writer.println("Content-Disposition: form-data; name=\"file1\"; filename=\"" + textFile.getName() + "\"");
        writer.println("Content-Type: application/octet-stream");
        FileInputStream fin = new FileInputStream(textFile);
        writer.println();
        IOUtils.copy(fin, output);
        writer.println();
        // End of multipart/form-data.
        writer.println("--" + boundary + "--");
        output.flush();
        closeQuietly(fin, writer, output);
        // Above request will never be sent if .getInputStream() or .getResponseCode() or .getResponseMessage() does not get called.
        connection.getResponseCode();
    }
}

HttpURLConnection有一组影响请求的setter,因此它需要知道您何时完成了请求的构建,以便它可以发送请求。它这样做的方式是等待,直到您实际从请求中请求返回某些内容,如InputStream。(这可以说是一个设计缺陷。)这也是为什么setter会抛出一个非法状态异常“如果已经连接”——一旦你调用getter,连接就建立了,现在调用setter已经太迟了


您应该能够调用
getInputStream()
,然后只
close()
它,而不需要实际读取它。

HttpURLConnection有一组影响请求的设置程序,因此它需要知道您何时完成了请求的构建,以便它可以发送请求。它这样做的方式是等待,直到您实际从请求中请求返回某些内容,如InputStream。(这可以说是一个设计缺陷。)这也是为什么setter会抛出一个非法状态异常“如果已经连接”——一旦你调用getter,连接就建立了,现在调用setter已经太迟了


您应该能够调用
getInputStream()
,然后只
close()
它,而不需要实际读取它。

只需调用getResponseCode()。这将启动传输。无论如何,您必须这样做才能确保请求成功,或者找出失败的原因。

只需调用getResponseCode()。这将启动传输。无论如何,您都必须这样做,以确保请求成功,或者找出失败的原因。

对于检查此代码段的人,我认为有一行是错误的:

OutputStream output = output = connection.getOutputStream();
看看吧;)

顺便说一句,在建立连接时,您确实必须使用
getResponseCode()
方法来处理异常,这样做很好,您可以确保连接正常工作。

对于检查此代码段的人,我认为有一行是错误的:

OutputStream output = output = connection.getOutputStream();
看看吧;)

顺便说一句,在建立连接时,您确实必须使用
getResponseCode()
方法尝试处理异常,这样做很好,您可以确保连接正常工作。

感谢您的帮助。我已经改正了。然而,就编译失败而言,这并不是错误的。这只是复制品。谢谢你把它捡起来。我已经改正了。然而,就编译失败而言,这并不是错误的。它只是复制品。