当前位置: 首页 > 面试题库 >

在Restlet中上传带有说明的文件

慕才
2023-03-14
问题内容

我需要使用 restlet* 上传 带有其他数据 的文件 。因此,我创建了一个示例html页面,如下所示。 *

<html>
<body>
    <h1>*****Upload File with RESTFul WebService*****</h1>
    <form action="http://localhost:8080/test/api/streams/sample.json" method="post" enctype="multipart/form-data">


        <fieldset>
            <legend>Upload File</legend>

            <input type="file" name="fileToUpload"/><br />  
            <br /><br />
            Party ID<input type="text" name="mybody"  /><br />


            <input type="submit" name="Upload" id="Upload" value="Upload" />
        </fieldset>
    </form>
</body>

我需要从 输入字段中 读取值以及文件数据。现在可以读取文件内容。如何在同一api调用中从该输入框中获取值。

@Post
public Representation accept(Representation entity) throws Exception {
Representation result = null;


if (entity != null) {
  if (MediaType.MULTIPART_FORM_DATA.equals(entity.getMediaType(), true)) {
    // 1/ Create a factory for disk-based file items
    DiskFileItemFactory factory = new DiskFileItemFactory();
    factory.setSizeThreshold(1000240);

    // 2/ Create a new file upload handler based on the Restlet
    // FileUpload extension that will parse Restlet requests and
    // generates FileItems.
    RestletFileUpload upload = new RestletFileUpload(factory);

    // 3/ Request is parsed by the handler which generates a
    // list of FileItems
    FileItemIterator fileIterator = upload.getItemIterator(entity);

    // Process only the uploaded item called "fileToUpload"
    // and return back
    boolean found = false;
    while (fileIterator.hasNext() && !found) {
      FileItemStream fi = fileIterator.next();
      Extractor extractor = new Extractor(getContext());

      if (fi.getFieldName().equals("fileToUpload")) {
        found = true;
        // consume the stream immediately, otherwise the stream
        // will be closed.
        StringBuilder sb = new StringBuilder("media type: ");
        sb.append(fi.getContentType()).append("\n");
        sb.append("file name : ");
        sb.append(fi.getName()).append("\n");
        BufferedReader br = new BufferedReader(new InputStreamReader(fi.openStream()));
        String line = null;
        while ((line = br.readLine()) != null) {
          sb.append(line);
        }
        sb.append("\n");
        result = new StringRepresentation(sb.toString(), MediaType.TEXT_PLAIN);
      }
    }
  } else {
    setStatus(Status.CLIENT_ERROR_BAD_REQUEST);
  }
  System.out.println("result==" + result);
}


return result;

}


问题答案:

首先,您需要了解请求的内容。如果您查看发送的请求(萤火虫或其他),您将看到以下内容:

-----------------------------2003194375274723921294130757
Content-Disposition: form-data; name="fileToUpload";
filename="mysql.sql" Content-Type: application/sql

<<YOUR FILE CONTENT>>
-----------------------------2003194375274723921294130757
Content-Disposition: form-data; name="mybody"

my value
-----------------------------2003194375274723921294130757
Content-Disposition: form-data; name="Upload"

Upload
-----------------------------2003194375274723921294130757--

如您所见,请求中包含多个部分。这意味着您可以遍历服务器资源中的这些部分。在您提供的代码中,您仅查找具有名称的条目,fileToUpload找到该条目后,您将中断循环。

您可以更新代码以完成完整循环并检查mybody输入字段的值,如下所述:

while (fileIterator.hasNext()) {
    FileItemStream fi = fileIterator.next();

    if ("mybody".equals(fi.getFieldName())) {
        BufferedReader br = new BufferedReader(
                 new InputStreamReader(fi.openStream()));
        String fieldValue = null;
        if ((line = br.readLine()) != null) {
            fieldValue = line;
        }
    } else if ("fileToUpload".equals(fi.getFieldName())) {
        (...)
    }
    (...)
}

希望能有所帮助,蒂埃里



 类似资料:
  • 问题内容: http://www.mkyong.com/webservices/jax-rs/file-upload-example-in- jersey/ 我正在遵循本指南并遇到问题。我有一些问题。 是否所有依赖项都必须对应?我的项目有一些org.glassfish.jersey依赖项,本指南建议使用org.sun.jersey。我是否也必须使用相同的版本进行更改? 我有这个错误 这是我的网络服

  • templates 文件夹 官方一系列模版所在的文件夹,包括了图片、xml、html以及相关配置文件等。通过对这里的了解和修改,我们可以做出自己的皮肤模版,然后一键生成,实现批量的工作流。当然,正常情况下,你也无需从这里拷贝,因为在droplet过程中会自动生成。部分模版在默认droplet过程中并没有使用到。 viewer 文件夹 krpano 下载包的官方插件、引擎、案例的存放位置,同时也是让

  • 说明文件 CONTRIBUTORS:作者信息 README.md:主说明文件 doc/doxygen.cfg:执行doxygen生成文档时的配置文件。

  • 我正试图使用阿拉莫菲尔上传文件。使用文件()时,上传效果很好,但是,我似乎不知道如何使用选项? 这是我的测试: 我的状态代码是415? 此外,如何在上传中发送其他参数? 谢啦 编辑 我没有设置正确的内容类型: 仍然不知道如何发送附加参数随上传。

  • 我知道有一些方法可以捆绑应用程序并将其部署在Tomcat或Jetty中。但是,如果我这样做了,最大的问题就变成了如何与Restlet集成。 我做了进一步的挖掘。我举了骆驼附带的一个tomcat例子。然后我试着让它具有RESTLET功能。差不多管用了。现在的问题是参数没有传递到路由。我希望当调用这个服务器:http://x.x.x.x.x:8080/rs/user/?name=Paul时,我会得到:

  • 问题内容: 我正在尝试在Swift中上传带有参数的图像。当我尝试此代码时,我可以获取参数,但不能获取图像 编辑2: 我认为保存的UIImage的路径存在一些问题,因为php告诉我该文件已经存在,这是因为我将其发送为空白 问题答案: 在下面的评论中,您告知我们您正在使用语法来检索文件。这意味着您要创建一个请求。该过程基本上是: 为您的请求指定边界。 指定请求的一个,以指定该请求及其边界。 创建请求正