everyone.
I started to use the restEasy (jboss) java rest client and met a problem I cannot seem to solve.
So far, I could use it to bring back json from the rest server (string form).
One of the rest service I need brings back a zip file, however. And I stumbled on a problem.
Here is the code :
ClientRequest req = new ClientRequest("rest service url"); //the url is good
ClientResponse<String> res = null;
res = req.get(String.class);
ZipInputStream zip = new ZipInputStream(new
ByteArrayInputStream(res.getEntity().getBytes()));
ZipEntry zipEntry = zip.getNextEntry();
System.out.println(zipEntry.getName());
//here, I print the name of the first file in my archive, so, I seem to have a
// zip file indeed
String jsonString = IOUtils.toString(zip);
//bam, this is causing a zipException : invalid block type
Google told me that it was the correct way to read a zip file. I tried to read it byte by byte, too, and It throws the sams exception on zip.read().
Did I do something wrong?
What Should I do to read the content of my file?
I would be gratefull for any insight on that matter.
Thanks
P.S : Sorry if I sound strange, English is not my first language.
URL url = new URL("http://xyz.com/download.zip");
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
connection.setRequestMethod("GET");
IntpuStream in = connection.getInputStream();
FileOutputStream out = new FileOutputStream("download.zip");
copy(in, out, 1024);
out.close();
public static void copy(InputStream input, OutputStream output, int bufferSize) throws IOException {
byte[] buf = new byte[bufferSize];
int n = input.read(buf);
while (n >= 0) {
output.write(buf, 0, n);
n = input.read(buf);
}
output.flush();
}
Lets say your Service is defined as below on server side
/**
*
* http://rama-local:8081/RESTfulDemoApplication/files/download/Test.pdf
* Where Test.pdf is the document I have stored under SERVER_DOWNLOAD_LOCATION_FOLDER path.
*
*/
@GET
@Path("/files/download/{fileName}")
@Produces(MediaType.APPLICATION_OCTET_STREAM)
public Response getFile(@PathParam("fileName") String fileName) {
File file = new File(SERVER_DOWNLOAD_LOCATION_FOLDER+fileName);
ResponseBuilder response = Response.ok((Object) file);
response.header("Content-Disposition","attachment; filename="+fileName);
return response.build();
}
You can define on your client side a interface as
public interface RestEasyFileServiceRestfulClient {
@GET
@Path("/files/download/{fileName}")
@Produces(MediaType.APPLICATION_OCTET_STREAM)
public Response getFile(@PathParam("fileName") String fileName);
}
Then you can download the file using java rest client as below
Class RestTest {
public static void main(String[] args) throws Exception {
String fileServiceUrl = "http://rama-local:8081/RESTfulDemoApplication/files";
RestEasyFileServiceRestfulClient fileServiceClient = ProxyFactory.create(RestEasyFileServiceRestfulClient.class,fileServiceUrl);
BaseClientResponse response = (BaseClientResponse)fileServiceClient.getFile("ASD.zip");
File s = (File)response.getEntity(File.class);
File ff = new File("C:\\ASD.zip");
s.renameTo(ff);
FileWriter fr = new FileWriter(s);
fr.flush();
System.out.println("FileDownload Response = "+ response.getStatus());
}
}
This requires
- resteasy-jaxrs-2.3.1.GA.jar
- resteasy-multipart-provider-2.3.1.GA.jar
More info at
http://docs.jboss.org/resteasy/docs/1.0.2.GA/userguide/html/RESTEasy_Client_Framework.html
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.util.Date;
import java.util.zip.ZipEntry;
import java.util.zip.ZipInputStream;
public class ZipReader {
// Expands the zip file passed as argument 1, into the
// directory provided in argument 2
public static void main(String args[]) throws Exception
{
if(args.length != 2)
{
System.err.println("zipreader zipfile outputdir");
return;
}
// create a buffer to improve copy performance later.
byte[] buffer = new byte[2048];
// open the zip file stream
InputStream theFile = new FileInputStream(args[0]);
ZipInputStream stream = new ZipInputStream(theFile);
String outdir = args[1];
try
{
// now iterate through each item in the stream. The get next
// entry call will return a ZipEntry for each file in the
// stream
ZipEntry entry;
while((entry = stream.getNextEntry())!=null)
{
String s = String.format("Entry: %s len %d added %TD",
entry.getName(), entry.getSize(),
new Date(entry.getTime()));
System.out.println(s);
// Once we get the entry from the stream, the stream is
// positioned read to read the raw data, and we keep
// reading until read returns 0 or less.
String outpath = outdir + "/" + entry.getName();
FileOutputStream output = null;
try
{
output = new FileOutputStream(outpath);
int len = 0;
while ((len = stream.read(buffer)) > 0)
{
output.write(buffer, 0, len);
}
}
finally
{
// we must always close the output file
if(output!=null) output.close();
}
}
}
finally
{
// we must always close the zip file.
stream.close();
}
}
}