Java POSTing 文件导致 HTTP 422

标签 java http file post

我正在尝试构建一个小型 Java 应用程序来连接到名为 CampFire 的应用程序,但在尝试将文件上传到系统时遇到了麻烦。我用来上传文件的Java代码如下:

public static String postFile(String requestUri, File f)
{
  debug("Running postFile.");
  logIn();

  debug("Sending File: " + f.getAbsolutePath() + " to " + campFireURL + requestUri);

  URL url;
  URLConnection conn;

  String linebreak = "\r\n";
  String boundary = "**********xxx**********";
  String twoHyphens = "--";


  String result = "";
  String request = twoHyphens + boundary + linebreak +
    "Content-Disposition: form-data; name=\"upload\"; filename=\"" + f.getName() + "\"" + linebreak +
    linebreak +
    "";
  debug("Request: " + request);

  try
  {
   FileInputStream in = new FileInputStream(f);

   auth.resetTries();
   Authenticator.setDefault(auth);

   // Send data
   url = new URL(campFireURL + requestUri);
   conn = url.openConnection();
   conn.setDoOutput(true);
   conn.setDoInput(true);
   conn.setUseCaches(false);

   conn.setRequestProperty("Connection", "Keep-Alive");
   conn.setRequestProperty("Content-Type", "multipart/form-data; boundary=" + boundary);

   DataOutputStream wr = new DataOutputStream(conn.getOutputStream());

   wr.writeBytes(request);

   int i;
   while((i = in.read()) != -1)
   {
    wr.write(i);
   }

   wr.writeBytes(linebreak + twoHyphens + boundary + twoHyphens + linebreak);
   wr.flush();

   wr.close();
   in.close();

   result = readFromConnection(conn);
  }
  catch (Exception e)
  {
   debug(e);
   JOptionPane.showMessageDialog(null, "Error running postData: " + e.getMessage(), "HTTP POST Error", JOptionPane.ERROR_MESSAGE);
   die();
  }

  return(result);
 }

当我使用真实文件运行它时,我收到以下错误......

Running postFile.
Sending File: /home/myuser/Desktop/blah.png to https://blah.campfirenow.com/room/blah/uploads.xml
Request: --**********xxx**********
Content-Disposition: form-data; name="upload"; filename="blah.png"
Server returned HTTP response code: 422 for URL: blah blah
java.io.IOException: Server returned HTTP response code: 422 for URL: blah blah

知道我在这里做错了什么吗?我对 Java 还很陌生,想知道我是否错过了一些明显的东西?

最佳答案

HTTP error 422意思是“不可处理的实体”。快速浏览后,我发现一个错误:PNG 文件是二进制文件。您必须添加 Content-Transfer-Encoding: binary到该部分的标题。

如果仍然不起作用,那么您可以在 this answer 底部的上传文件部分找到示例。有用。

关于Java POSTing 文件导致 HTTP 422,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4597669/

相关文章:

web-services - 哪个 HTTP 动词适合设置 bool 值?

java - 读取文本文件时出现问题

java - 如何让用户以ajax成功方法下载文件?

java - 使用 Stripes 的实践经验?

java - JSF 页面中的单词和链接之间的空格被删除

javascript - 导航跟随滚动

java - Jersey/JAX-RS 放置、删除幂等性 - 由程序员提供或完成

file - Lua中如何获取文件大小和删除文件?

java - Java中linkedList实现的删除方法

java - 如何在每个 int 和非 int 值之间添加空格?