使用JavaURL类将数据写入服务器是否需要服务器响应?
我试图使用Java使用JavaURL类将数据写入服务器是否需要服务器响应?,java,file-upload,httpurlconnection,Java,File Upload,Httpurlconnection,我试图使用JavaURL类上传文件,我发现了一个栈上溢出,它很好地解释了细节,所以我尝试遵循它。下面是我的代码,它来自于 我的问题是,如果我不调用connection.getResponseCode()或connection.getInputStream()或connection.getResponseMessage()或与服务器响应相关的任何东西,请求将永远不会发送到服务器。我为什么要这样做?或者有没有办法在没有得到响应的情况下写入数据 另外,我开发了一个服务器端上传servlet,它接受多部
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()
方法尝试处理异常,这样做很好,您可以确保连接正常工作。感谢您的帮助。我已经改正了。然而,就编译失败而言,这并不是错误的。这只是复制品。谢谢你把它捡起来。我已经改正了。然而,就编译失败而言,这并不是错误的。它只是复制品。