GAE/J:如何从appengine向Facebook发送一个多部分MIME消息的POST请求

5

我希望能够将存储在Appengine数据库中的照片发布到Facebook上。

为了测试,我已经在本地掌握了基本的理解:我已经成功使用以下表单:

<form action="https://graph.facebook.com/7378294228/photos?access_token=AAAAAJPBSAzcBALmz7GOLZCER7Pc2347WQIDIlIFR8e2imWUzeuCKRLrXjAqR6zjaUb4laqkLtJlQlYa7X5ZBd2aNJoLom8M7IlvHfw39QZDZD" method="POST" enctype="multipart/form-data">
<input type="file" name="source" id="source"/>
<input type="text" name="message" value="mymess"/>
<input type="Submit"/>
</form>

我从最近的会话中获取了access_token以使其工作。以下是我在appengine上尝试但未成功的内容:
MultipartEntity mpEntity  = new MultipartEntity();
ContentBody cbFile = new ByteArrayBody(imageBytes, "image/jpeg", "w.jpg");
mpEntity.addPart("source", cbFile);

URL url = new URL("https://graph.facebook.com/"+albumUpload.getAlbumID()+"/photos?access_token="+albumUpload.getAuthToken());                   
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
connection.setDoOutput(true);
connection.setRequestMethod("POST");

mpEntity.writeTo(connection.getOutputStream());

if (connection.getResponseCode() == HttpURLConnection.HTTP_OK) {
   System.err.println("http success!");
}else{
   System.err.println("http failed:"+connection.getResponseCode());
}

我收到了HTTP 400 - 错误请求的提示。

我添加了这些内容以确保它在发挥作用:

System.out.println("mpEntity image content length: "+cbFile.getContentLength());
System.out.println("mpEntity content type:"+mpEntity.getContentType());

这会导致:
mpEntity image content length: 786145 
mpEntity content type:Content-Type: multipart/form-data; boundary=oMiJCBHGVvZmU7s3FcUGXMbyU23aX_Ow 

我能找到的MultipartEntity使用示例在线上都是使用HttpClient的setEntity()方法,因此这些示例并不适用于在appengine下进行URLFetch。谢谢你的任何帮助或代码。
1个回答

10

问题已解决!

我需要添加:

connection.addRequestProperty("Content-length", mpEntity.getContentLength()+"");
connection.addRequestProperty(mpEntity.getContentType().getName(), mpEntity.getContentType().getValue());

还有以下变更:

MultipartEntity mpEntity  = new MultipartEntity(HttpMultipartMode.BROWSER_COMPATIBLE);

希望这能帮到某些人


谢谢你,@abramcat。你给了我很大的帮助。我花了1.5天时间尝试从GAE发布多部分内容。 - payliu
感谢abramcat,你的文档对我来说是巨大的支持。非常感激!只是想知道为什么像文件上传这样的“基本”事情要如此复杂且文档写得如此糟糕。 - Hugues

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接