0

我想使用 Java Applets 上传多个文件。

我使用 Apache Http Client 开发了一个工作应用程序。

上面的问题是小程序依赖作为 Apache Http 客户端的 Jar(s)。

目前,我只需要为一个小功能[文件上传]导入/下载 7 个 jar 文件。

在生产环境中,它会大大增加下载时间。

所以我想要一个简单的库或 Java 类,我们可以通过它使用 HTTP 协议上传多个文件并获得简单的响应。

我在互联网上找到了很多代码等等,但是问题从二进制上传开始。

例如,如果我们使用简单上传上传一个波形文件,当我们在服务器端监听它上传后,它会失真。

如果我们使用 simple upload 上传 JPEG 文件,上传后我们在服务器端看到它的质量是不同的。

以上所有问题我们在使用 apache http 客户端时都不会遇到。

我使用了 POST Upload Using URLConnection中的这段代码

如果我们使用 Apache HTTP 客户端进行上传有什么好处?

如果我们使用 URLConnection 上传二进制文件有什么问题?

如果我使用以下代码Multipart Request会起作用吗?使用此代码有什么缺点吗?

或者

任何人都有一个工作代码来上传多个二进制文件,使用 HTTP 协议唱 URL 连接类。

4

1 回答 1

0

这是多部分缓冲上传的工作代码:

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();
}

您可以添加更多具有新边界的文件。但基本上,使用 Apache 库将更容易实现和支持此代码。

于 2013-06-10T21:42:58.763 回答