我对Java有点绿,但在尝试通过SQUID HTTP代理将本地文件上传到远程FTP服务器时遇到了一个问题(请注意这显然是我的双手,以便'FTP'和'SOCKS '代理类型不在范围内)。
所以这是我的代码:
URL url = new URL(urlString);
OutputStream os ;
System.setProperty("proxySet", "true");
System.setProperty("proxyHost", proxyHost.trim());
System.setProperty("proxyPort", proxyPort.stringValue());
URLConnection ftpConn = url.openConnection() ;
ftpConn.setAllowUserInteraction(true); //threw this in to see if it would work, does nothing
ftpConn.setDoOutput(true); //here is where I set the setDoOutput
os = ftpConn.getOutputStream(); //here is where the exception occurs
我一直得到这个例外:
Java调用由未被捕获的Java终止 exception:java.net.ProtocolException: 如果不能写入URLConnection doOutput = false - 调用 setDoOutput(真)
所以我用 FTPURLConnection 等尝试了这个问题并且遇到了同样的问题。
调试时,似乎在ftpConn中有不少于三个名为 doOutput 的变量。
只有一个是可编辑的(而另外两个不是)
在设置 ftpConn.setDoOutput(true)之后,第一个(似乎是通过 getDoOutput 返回的那个)返回 true ;
的源代码 public synchronized OutputStream getOutputStream()
throws IOException {
try {
if (!doOutput) {
throw new ProtocolException(
"cannot write to a URLConnection"
+ " if doOutput=false - call setDoOutput(true)");
}
查看FtpURLConnection中的代理处理使我相信,当它确定您正在使用HTTP代理时,它会将处理传递给HttpURLConnection。
这是我认为发生断开连接的地方(无论是我还是图书馆或代理人)。
我是否错过设置 setDoOutput 或其他内容?
我已经能够成功地通过代理获取GET,但PUT在doOutput上都是FAILING。
感谢您提供任何帮助或指示,让它发挥作用。
P.S。 我正在使用Java 1.5.0_10(我们在这里与其他应用程序保持一致)
答案 0 :(得分:0)
很好地发现这是metalink中的一个错误(错误6519647)。解决方法几乎是使用不同的东西!
(无论代理如何设置(使用/不使用“http。”,甚至通过代理类),此错误仍然存在
抱歉重复编辑/回答,这是我对自己问题的第一个'回答'。
切换到ftp4j但仍然遇到squid代理问题(这是一个完全不同的故事)。