有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java Play框架:使用WS将图像发布到imageshack

我正在尝试使用their API和Play Framework的WSRequest对象POST将图像转换为imageshack

我的代码如下:

public static void upload( Picture picture ) throws Exception {

    //set file parameter - in this case the image
    WS.FileParam fp = new WS.FileParam( picture.asFile, "fileupload");

    //set other parameters
    Map<String,Object> params = new HashMap<String, Object>();
    params.put( "optsize", "resample" );
    params.put( "rembar", "yes" );
    params.put( "public", "no" );
    params.put( "a_username", username );
    params.put( "a_password", password );
    params.put( "key", a_key );

    //POST request
    Document doc = WS.url( "http://www.imageshack.us/upload_api.php" )
        .setHeader( "Content-Type", picture.contentType )
        .mimeType( "multipart/form-data" )
        .params( params )
        .files( fp )
        .post()
        .getXml();
}

然而,我总是从imageshack那里得到以下回应:

很抱歉,我们检测到收到了意外数据。缺少必需的参数“fileupload”,或者您的帖子不是多部分/表单数据

我已尝试使用字节数组将文件作为参数发送:

params.put( "fileupload", Base64.encode( picture.asBytes )  )

但这也导致Imageshack做出同样的反应

这让我快发疯了。有人能指出我哪里出了问题,或者可能为我指出一个更好的解决方案的方向吗?谢谢


原因

经过一番研究,我发现我忽略了这个问题中的一些重要信息。。。。我正在我的应用程序中包括谷歌应用程序引擎模块

根据Play Framework Google Group,当使用GAE时,与将文件附加到WS请求相关联的代码实际上只是注释掉了。这就是它不起作用的原因。因此,没有为您抛出错误,也没有说明它为什么不起作用。。。你只需要解决它

我已经接受了@Gary的回答,因为这是使用WS将图像上传到imageshack的正确方法,只是在使用GAE时没有


共 (2) 个答案

  1. # 1 楼答案

    您未正确设置内容类型标题

    与此相反:

    .setHeader( "Content-Type", picture.contentType )
    

    试试这个:

    .setHeader( "Content-Type", "multipart/form-data" )
    
  2. # 2 楼答案

    我认为您不需要直接指定内容类型或mime类型

    我使用以下代码成功上传

    WS.FileParam fp = new WS.FileParam(
          new File("d:\\workspace\\ImageShackTest\\sample_picture.png"), "fileupload");
    
        Map<String,Object> params = new HashMap<String, Object>();
        params.put( "optsize", "resample" );
        params.put( "rembar", "yes" );
        params.put( "public", "yes" );
        //params.put( "a_username", username );
        //params.put( "a_password", password );
        params.put( "key", API_KEY );
    
        //POST request
        Document doc = WS.url( "http://www.imageshack.us/upload_api.php" )
            .params( params )
            .files( fp )
            .post()
            .getXml();
    

    我认为,当您将文件附加到请求时,它会自动决定它将是多部分/表单数据

    这是我的整个控制器(API密钥除外)

    package controllers;
    
    import play.*;
    import play.mvc.*;
    import java.util.*;
    import models.*;
    import play.libs.*;
    import java.io.File;
    
    public class Application extends Controller {
    
        public static void index() { render(); }
    
        private static final String API_KEY = "API KEY REMOVED TO PROTECT THE INNOCENT";
    
        public static void tryUpload() {
            WS.FileParam fp = new WS.FileParam( new File("d:\\workspace\\ImageShackTest\\sample_picture.png"), "fileupload");
    
            Map<String,Object> params = new HashMap<String, Object>();
            params.put( "optsize", "resample" );
            params.put( "rembar", "yes" );
            params.put( "public", "yes" );
            params.put( "key", API_KEY );
    
            String doc = WS.url( "http://www.imageshack.us/upload_api.php" )
                .params( params )
                .files( fp )
                .post()
                .getString();
    
            System.out.println(doc);
    
            index();
        }
    }
    

    这就是应用程序。配置文件

    # This is the main configuration file for the application.
    # ~~~~~
    application.name=ImageShackTest
    application.mode=dev
    %prod.application.mode=prod
    application.secret=JIVQE8y3y1lCzXRGprFJvoXBdi8Jpa8qE1U1mBIooLLOOYk5yyhAI5cxbEf4q4pl
    date.format=yyyy-MM-dd
    attachments.path=data/attachments
    mail.smtp=mock
    

    我没有做任何其他的改变。刚刚浏览到http://localhost:9000/Application.tryUpload,可以在游戏控制台上看到成功的XML