如何在HttpURLConnection上设置Entity

时间:2014-04-01 00:46:48

标签: java

在我的项目中,我必须严格使用HttpURLConnection类

我从互联网上获得以下代码

MultipartEntity multiPart = new MultiPartEntity(HttpMultipartMode.BROWSER_COMPATIBLE, null Chartset.forName("UTF-8");
File f = new File("/home/abhishek/foo.docx");
FileBody fb = new FileBody(f);
multiPart.addPart("file", fb);
HttpPost post = new HttpPost();
post.setHeader("ENCTYPE", "multipart/form-data");
post.setEntity(multiPart);

问题是我不能使用HttpPost ...在我的项目中只有HttpURLConnection类可以工作!

所以我需要将上面的代码翻译成HttpURLConnection。

我在HttpUrlConnection上找不到类似于setEntity的东西。

编辑::

基于以下建议。我有这个代码

public class RESTFileUpload {
      public static void main(String[] args) throws Exception {
            Authenticator.setDefault(new Authenticator() { 
                @Override
                public PasswordAuthentication getPasswordAuthentication() {
                 return new PasswordAuthentication("domain\\user", "Password".toCharArray());
                }
            });

            String filePath = "/home/abhishek/Documents/HelloWorld.docx";
            String fileName = "HelloWorld.docx";
            String fileNameShort = "HelloWorld";

            String urlStr = "https://sp.company.com/sites/abhi_test/_vti_bin/listdata.svc/SharedDocuments/RootFolder/Files/add(url=@TargetFileName,overwrite='true')&@TargetFileName=" + fileName;
            String crlf = "\r\n";
            String twoHypens = "--";
            String boundary = "*****";
            URL url = new URL(urlStr);          
            HttpURLConnection con = (HttpURLConnection) url.openConnection();           
            con.setDoOutput(true);
            con.setDoInput(true);     
            con.setUseCaches(false);
            con.setRequestMethod("POST");
            con.setRequestProperty("Connection", "Keep-Alive");
            con.setRequestProperty("Cache-Control", "no-cache");
            con.setRequestProperty("Content-Type", "multipart/form-data;boundary=" + boundary);
            DataOutputStream request = new DataOutputStream(con.getOutputStream());
            request.writeBytes(twoHypens + boundary + crlf);
            request.writeBytes("Content-Disposition: form-data;name=\"" + fileNameShort + "\";fileName=\"" + fileName + "\"" + crlf);
            request.writeBytes(crlf);
            request.write(convertToByteArray(filePath));
            request.writeBytes(crlf);
            request.writeBytes(twoHypens + boundary + twoHypens + crlf);
            request.flush();
            request.close();

            InputStream responseStream = new BufferedInputStream(con.getInputStream());
            BufferedReader responseStreamReader = new BufferedReader(new InputStreamReader(responseStream));
            String line = "";
            StringBuilder strBuilder = new StringBuilder();
            while((line = responseStreamReader.readLine()) != null) {
                strBuilder.append(line).append("\n");
            }
            responseStreamReader.close();
            String response = strBuilder.toString();
            responseStream.close();
            con.disconnect();
            System.out.println(response);
      }   

      private static byte[] convertToByteArray(String filePath) {
          File f = new File(filePath);
          byte[] retVal = new byte[(int)f.length()];
          try {
              FileInputStream fis = new FileInputStream(f);
              fis.read(retVal);
          }
          catch (FileNotFoundException ex) {
              ex.printStackTrace();
          }
          catch(IOException ex2) {
              ex2.printStackTrace();
          }
          return retVal;
      }
}

但是我收到了错误

Exception in thread "main" java.io.IOException: Server returned HTTP response code: 400 for URL: https://sp.web.gs.com/sites/abhi_test/_vti_bin/listdata.svc/SharedDocuments/
    at sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1626)
    at sun.net.www.protocol.https.HttpsURLConnectionImpl.getInputStream(HttpsURLConnectionImpl.java:254)
    at RESTFileUpload.main(RESTFileUpload.java:62)

2 个答案:

答案 0 :(得分:3)

HttpURLConnection具有.getInputStream()和.getOutputStream()方法。如果您希望使用Http请求发送正文内容,请在HttpURLConnection对象上调用.setDoOutput(true),调用.getOutputStream()以获取输出流,然后将实体的内容写入输出流(作为原始字节,或使用某种类型的Writer实现),在完成编写后关闭它。

有关详情,请参阅HttpURLConnection here的API文档。

答案 1 :(得分:2)

要使用HttpURLConnection发布文件,您必须手动编写文件包装器。看一下这个answer,它应该对你有帮助。