3

我有这个来运行这个命令,它给了我正确的输出,我想在java中使用HttpUrlConnection(或任何第三方库)来模拟它

curl http://localhost/myservice/ -v  -H 'Content-Type: multipart/form-data' -F 'file=@/home/xyz/abc.jpg' -F 'type=image' -F 'id=123'

该服务接受一个文件、一个类型和一个 ID。

我当前的代码如下所示-

    String urlToConnect = "http://localhost/myservice/";
    String boundary = Long.toHexString( System.currentTimeMillis() ); // Just generate some unique random value
    HttpURLConnection connection = (HttpURLConnection) new URL( urlToConnect ).openConnection();
    connection.setDoOutput( true ); // This sets request method to POST.
    connection.setRequestProperty( "Content-Type", "multipart/form-data; boundary="+boundary);
    PrintWriter writer = null;
    try
    {
    writer = new PrintWriter( new OutputStreamWriter( connection.getOutputStream(), "UTF-8" ) );

        writer.println( "--" + boundary );

        // -F type =1
        writer.println( "Content-Disposition: form-data; name=\"type\"" );
        writer.println( "Content-Type: text/plain; charset=UTF-8" );
        writer.println();
        writer.println( "image" );
        //writer.println( "--" + boundary );
        // -F id=1
        writer.println( "Content-Disposition: form-data; name=\"id\"" );
        writer.println( "Content-Type: text/plain; charset=UTF-8" );
        writer.println();
        writer.println( 123 );
        //writer.println( "--" + boundary );

        writer.println( "Content-Disposition: form-data; name=\"file\"; filename=\"abc.jpg\"" );
        writer.println( "Content-Type: image/jpeg;" );
        writer.println();
        BufferedReader reader = null;
        try
        {
            reader = new BufferedReader( new InputStreamReader( new FileInputStream(
                "/home/xyz/abc.jpg" ), "UTF-8" ) );
            for( String line; (line = reader.readLine()) != null; )
            {
                writer.println( line );
            }
        }
        finally
        {
            if( reader != null ) try
            {
                reader.close();
            }
            catch( IOException logOrIgnore )
            {
            }
        }


    }
    finally
    {
        if( writer != null ) writer.close();
    }

    // Connection is lazily executed whenever you request any status.
    int responseCode = ((HttpURLConnection) connection).getResponseCode();
    System.out.println( responseCode ); // Should be 200

    StringBuffer responseContent = new StringBuffer();
    BufferedReader rd = null;
    try
    {
        rd = new BufferedReader( new InputStreamReader( connection.getInputStream() ) );
    }
    catch( Exception e )
    {
        rd = new BufferedReader( new InputStreamReader( connection.getErrorStream() ) );
    }
    String temp = null;
    while( (temp = rd.readLine()) != null )
    {
        responseContent.append( temp );
    }

    System.out.println( "Response : " + responseContent );
}
4

2 回答 2

4

我已经尝试过使用 apache httpClient,现在我的代码看起来像

 HttpClient httpclient = new HttpClient();
    File file = new File( "/home/abc/xyz/solar.jpg" );

    // DEBUG
    logger.debug( "FILE::" + file.exists() ); // IT IS NOT NULL        
    try
    {
    PostMethod filePost = new PostMethod( "http://localhost/myservice/upload" );

    Part[] parts = { new StringPart( "type","image"),new StringPart( "id","1"), new FilePart( "file", file ) };
    filePost.setRequestEntity( new MultipartRequestEntity( parts, filePost.getParams() ) );

    // DEBUG


        int response = httpclient.executeMethod( filePost );
        logger.info( "Response : "+response );
        logger.info( filePost.getResponseBodyAsString());
    }
    catch( HttpException e )
    {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    catch( IOException e )
    {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

现在我得到了正确的响应代码。

于 2012-10-01T08:47:40.920 回答
2

首先,您不能使用 aBufferedReader来读取 jpeg 图像。此类仅用于阅读文本内容。您需要读取原始字节FileInputStream并将它们按原样发送到output stream您从connection.getOutputStream(). 中间没有作家。

于 2012-10-01T07:08:38.420 回答