Java小程序文件上载不使用HttpCleints
我想用Java小程序上传多个文件 我使用ApacheHTTP客户端开发了一个工作应用程序 上面的问题是小程序依赖性作为Apache Http客户端的Jar 目前,我只需要为一个小功能[文件上传]导入/下载7个jars文件 在生产环境中,它大大增加了下载时间 所以我想要一个简单的库或Java类,通过它我们可以使用HTTP协议上传多个文件,并且可以得到一个简单的响应 我在互联网上找到了这么多的代码,但问题开始于二进制上传 比如说,, 如果我们使用简单的上传上传来上传一个wave文件,当我们在服务器端监听它时,上传后的wave文件是失真的 如果我们上传一个JPEG文件使用简单的上传,上传后当我们看到在服务器端 它的质量是不同的 当我们使用ApacheHTTP客户端时,我们不会遇到上述所有问题 我使用了POST上的代码 如果我们使用ApacheHTTPCleints进行上传,有什么好处 如果使用URLConnection上载二进制文件,会出现什么问题 如果我使用以下代码,它会工作吗?使用这个代码有什么缺点吗 或Java小程序文件上载不使用HttpCleints,java,http,Java,Http,我想用Java小程序上传多个文件 我使用ApacheHTTP客户端开发了一个工作应用程序 上面的问题是小程序依赖性作为Apache Http客户端的Jar 目前,我只需要为一个小功能[文件上传]导入/下载7个jars文件 在生产环境中,它大大增加了下载时间 所以我想要一个简单的库或Java类,通过它我们可以使用HTTP协议上传多个文件,并且可以得到一个简单的响应 我在互联网上找到了这么多的代码,但问题开始于二进制上传 比如说,, 如果我们使用简单的上传上传来上传一个wave文件,当我们在服务器端
任何人都有使用HTTP协议通过URL连接类上载多个二进制文件的工作代码。这是多部分缓冲上载的工作代码:
HttpURLConnection connection = null;
int uploadBufferLength = BUFFER_DEFAULT_LENGTH;
String CRLF = "\r\n";
String boundary = (new GUID()).toString();
try
{
java.net.URL url = new URL( DEFAULT_URL );
connection = (HttpURLConnection) url.openConnection();
connection.setDoOutput( true );
connection.setDoInput( true );
connection.addRequestProperty( "Content-Type", "multipart/form-data; boundary=" + boundary );
for( String key : getHeaders().keySet() )
connection.addRequestProperty( key, getHeaders().get( key ) );
outputStreamRouter.setOutputStream( connection.getOutputStream() );
PrintWriter writer = new PrintWriter( new OutputStreamWriter( outputStreamRouter.getOutputStream(), "UTF-8" ), true );
writer.append( "--" ).append( boundary ).append( CRLF );
writer.append( "Content-Disposition: form-data; name=\"file\"; filename=\"" ).append( name ).append( "\"" ).append( CRLF );
writer.append( "Content-Type: application/octet-stream" ).append( CRLF );
writer.append( "Content-Transfer-Encoding: binary" ).append( CRLF );
writer.append( CRLF ).flush();
//This is custom OutputStream, which should be changed to your needs or a default
outputStreamRouter.writeStream( uploadBufferLength );
outputStreamRouter.flush();
writer.append( CRLF ).flush();
writer.append( "--" ).append( boundary ).append( "--" ).append( CRLF );
writer.close();
outputStreamRouter.close();
if( connection.getResponseCode() != 200 )
{
//handle error
}
else
{
//handle result
}
}
catch( MalformedURLException e )
{
throw new IllegalArgumentException( ExceptionMessage.FILE_UPLOAD_ERROR, e );
}
catch( UnsupportedEncodingException e )
{
throw new IllegalArgumentException( ExceptionMessage.FILE_UPLOAD_ERROR, e );
}
catch( IOException e )
{
throw new IllegalStateException( ExceptionMessage.FILE_UPLOAD_ERROR, e.getMessage() );
}
finally
{
if( connection != null )
connection.disconnect();
}
可以添加更多具有新边界的文件。
但是基本上,使用ApacheLibs将更容易实现和支持此代码。ApacheHTTP客户端的优点是它有一个比JDK中的等效类更好的API。7罐真的那么多吗?什么是1MB。。。。比如说网页上一张照片的大小?如果可以的话,我建议你使用它。如果没有,您肯定可以使JDK类(URLConnection)正常工作,只是麻烦多一点。如果你这样做的话,就把你的具体问题发出来。7个罐子不是问题,但在IE上下载需要2分钟2次,在chrome上下载需要1.30分钟,在较低的互联网连接上下载需要4分钟。正如我所说的,我已经在我的应用程序中成功地使用了Apache Http Cleint,但是现在当加载小程序时,依赖项产生了问题。@Micheal谢谢。它也适用于二进制文件吗?提到多部分,你的意思是我们模仿浏览器上传后的内容吗?这应该适用于二进制文件。@Micheal我试过你的代码,其中缺少一些东西。我试过了,太好了,谢谢你的回答。我在评论中说,你需要你的OutputStream写逻辑。如果你需要的话,我可以给你发一些变体。