如何在CXF JAX-RS中将文件作为附件发布

时间:2013-08-09 10:30:57

标签: java http cxf jax-rs

我正在尝试使用cxf和jaxrs发布使用gzip压缩的csv.file。

以下是服务器端代码。

import java.io.File;
 import java.io.FileOutputStream;
 import java.io.IOException;
 import java.io.InputStream;
 import java.io.OutputStream;
 import java.util.zip.GZIPInputStream;

import javax.servlet.http.HttpServletRequest;
 import javax.ws.rs.Consumes;
 import javax.ws.rs.POST;
 import javax.ws.rs.Path;
 import javax.ws.rs.Produces;
 import javax.ws.rs.core.Context;
 import javax.ws.rs.core.MediaType;
 import javax.ws.rs.core.Response;
 import javax.ws.rs.core.Response.Status;

import org.apache.cxf.helpers.IOUtils;
 import org.apache.cxf.jaxrs.ext.multipart.Multipart;

import org.kp.common.LogConstants;
 import org.kp.util.LogHelper;

@Path("TestData")
 public class TestDataResource {

  @POST
  @Produces("text/xml")
  @Consumes(MediaType.APPLICATION_OCTET_STREAM)
  public Response postTestData( final @Multipart InputStream stream,
    @Context HttpServletRequest request) {

    boolean result = true;

    LogHelper.setLog(LogConstants.INFO, request.getContentType());
    LogHelper.setLog(LogConstants.INFO, request.getCharacterEncoding());
    LogHelper.setLog(LogConstants.INFO, request.getHeader("charset"));
    LogHelper.setLog(LogConstants.INFO, request.getHeader("Content-Encoding"));
    LogHelper.setLog(LogConstants.INFO, request.getHeader("Content-Length"));
    LogHelper.setLog(LogConstants.INFO, request.getHeader("Transfer-Encoding"));


    writeToFile(stream);
    return Response.status(result == true ? Status.OK : Status.EXPECTATION_FAILED).build();

  }

 private void writeToFile(InputStream inputStream) {

  OutputStream outputStream = null;

  try {

   GZIPInputStream gzis = new GZIPInputStream(inputStream);
    // write the inputStream to a FileOutputStream
    outputStream = new FileOutputStream(new File(
      "d:\\temp\\test.csv"));
    IOUtils.copy(gzis, outputStream);
   } catch (IOException ex) {
    ex.printStackTrace();
   }
   finally{
    try {
     outputStream.close();
    } catch (IOException e) {
     // TODO Auto-generated catch block
     e.printStackTrace();
    }
   }
  }

}

客户端代码如下。

import java.io.FileInputStream;
 import java.io.FileNotFoundException;
 import java.io.InputStream;
 import java.util.LinkedList;
 import java.util.List;

import javax.ws.rs.core.MediaType;
 import javax.ws.rs.core.Response;

import org.apache.cxf.jaxrs.client.WebClient;
 import org.apache.cxf.jaxrs.ext.multipart.Attachment;
 import org.apache.cxf.jaxrs.ext.multipart.ContentDisposition;


 public class kpTest {

 public static void main(String[] str) throws FileNotFoundException{

  final String  URL = "http://localhost:8080/kp_services/services/kpservices/TestData";

  WebClient client = WebClient.create(URL);

  //client.type(MediaType.APPLICATION_OCTET_STREAM);
   client.type(MediaType.APPLICATION_OCTET_STREAM);
   ContentDisposition cd = new ContentDisposition("attachment;filename=test.csv.gz");
   List<Attachment> atts = new LinkedList<Attachment>();
   InputStream stream = new FileInputStream("D:\\kp\\test.csv.gz");
   Attachment att = new Attachment("root", stream, cd);
   atts.add(att);
   //Response response = client.post(new MultipartBody(att));

  // or just post the attachment if it's a single part request only
  // Response response = client.post(atts);

  // or just use a file
   //client.post(new File("D:\\kp\\test.csv"));

   Response response = client.post(new File("D:\\kp\\test.csv.gz"));
   System.out.println(response.getStatus());
  }
 }

上述程序运行正常。

Response response = client.post(new File("D:\\kp\\test.csv.gz"));

从上面的代码中我认为我不是将文件作为附件发送,而是将其作为输入流发送,并使用url编码。

当我尝试通过注释上面的行来修改代码并取消注释

Response response = client.post(atts);

我收到错误消息,说没有找到邮件正文编写器。我甚至尝试将服务器端代码从@Multipart InputStream stream更改为List attachement。我仍然指出同样的错误。如何为消息体编写器添加提供程序。有些人可以帮我解决问题。

1 个答案:

答案 0 :(得分:1)

通过将MediaType.APPLICATION_OCTET_STREAM和InputStream流替换为以下来修复它

@Consumes("multipart/form-data")
  public Response postTestData( final List<Attachment> attachments,
    @Context HttpServletRequest request)