我有这个运行这个命令,它给了我正确的输出,我想在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 );
}
答案 0 :(得分:3)
我尝试过使用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();
}
现在我收到了正确的回复代码。
答案 1 :(得分:2)
首先,您无法使用BufferedReader
来读取jpeg图像。本课程仅用于阅读文本内容。您需要使用FileInputStream
读取原始字节并按原样发送到output stream
connection.getOutputStream()
。中间没有作家。