从Java发送到WebService时,Zip文件已损坏

时间:2013-11-26 00:12:43

标签: java web-services post zip

我遇到一个问题,当我从Java程序向Web应用程序提交有效的Zip文件时,Web应用程序会将Zip文件解释为已损坏。通过Web浏览器将文件直接发布到Web应用程序允许正确解释相同的Zip文件。那我在Java程序中做错了什么呢?

我的Java Web应用程序可以通过HTTP POST通过Web服务接受Zip文件。我查看了Web应用程序上收到的字节,如果我通过浏览器将文件发送到我通过Java程序发送时,它们会有所不同。

我知道Zip是正确的,因为我的Web应用程序在通过Web应用程序提交时没有错误地接受它。我只是不知道当我通过我的Java程序发送它时出了什么问题。服务器端发生的错误是:

  

java.util.zip.ZipException:条目大小无效(预期231但有100个字节)

我怀疑问题必须与我在URL连接上创建有效负载(字节数组)或请求属性(或缺少正确的属性)有关。我用来发送我的zip文件的代码是:

public static void main(String[] args) throws Exception {
    // Convert the input file into a byte array 
    File inputFile = new File("C:/temp/myZip.zip");
    FileInputStream fis = new FileInputStream(inputFile);
    ByteArrayOutputStream bos = new ByteArrayOutputStream();
    byte[] buf = new byte[1024];
    for (int readNum; (readNum = fis.read(buf)) != -1;) {
        bos.write(buf, 0, readNum); //no doubt here is 0
    }

    Object payload = new String(bos.toByteArray());
    fis.close();


    // Setup a URL connection with the appropriate properties
    URL url = new URL("http://localhost:8080/MyWebApp/ws/rest");
    URLConnection urlc = url.openConnection();

    urlc.setDoOutput(true);
    urlc.setAllowUserInteraction(false);
    urlc.addRequestProperty("Accept-Encoding", "gzip");
    urlc.addRequestProperty("Content-Type", "application/text");
    urlc.addRequestProperty("Content-Type", "application/octet-stream");
    urlc.addRequestProperty("Content-Type", "multipart/form-data");

    // Submit the payload to my Web Service
    PrintStream ps = new PrintStream(urlc.getOutputStream());
    ps.print(payload);
    ps.close();
    InputStream stream = getInputStream(urlc);
}

任何建议都非常感谢。

谢谢,

菲尔

2 个答案:

答案 0 :(得分:1)

如何创建字节数组没有问题,您可以通过基于它创建新的.zip来测试它

FileOutputStream fos = new FileOutputStream("C:/temp/myZip2.zip");
fos.write(bos.toByteArray());

尝试将.write()与字节数组一起使用,而不是将.print()与字符串一起使用。因此,对于javadoc,它们都归结为.write(),但在您的情况下,您将发送.zip文件的字节表示字符串的字节表示,而不仅仅是.zip的字节表示。我不确定这是否是您的问题所在,但值得一试。

PrintStream ps = new PrintStream(urlc.getOutputStream());
ps.write(bos.toByteArray());
ps.close();

如果它没有帮助 - 请告诉我你的服务器http://localhost:8080/MyWebApp/ws/rest如何处理文件,它希望收到什么。

答案 1 :(得分:0)

复制并执行此代码以查看某些字节的更改可能是:

// Convert the input file into a byte array 
byte[] theBytes = new byte[256];       //  use to test all 256  byte values
for(int i=0; i < theBytes.length; i++)
  theBytes[i] = (byte)i;
ByteArrayInputStream bais = new ByteArrayInputStream(theBytes);
ByteArrayOutputStream bos = new ByteArrayOutputStream();
byte[] buf = new byte[1024];
for (int readNum; (readNum = bais.read(buf)) != -1;) {
    bos.write(buf, 0, readNum); //no doubt here is 0
}
Object payload = new String(bos.toByteArray());

// Submit the payload to my Web Service
ByteArrayOutputStream baos = new ByteArrayOutputStream();
PrintStream ps = new PrintStream(baos);
ps.print(payload);
ps.close();
// Now test what was sent
byte[] endBytes = baos.toByteArray();
for(int i=0; i < endBytes.length; i++) {
  if(endBytes[i] != (byte)i) {
     System.out.println(i + " vs " + endBytes[i]); // show changed bytes
  }
}

`

如何正确格式化上述代码???