首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Restlet中带有描述的文件上载

在Restlet中带有描述的文件上载
EN

Stack Overflow用户
提问于 2015-02-03 06:14:43
回答 1查看 1.7K关注 0票数 0

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

代码语言:javascript
复制
<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>

我需要从输入字段和文件data.Now中读取值,可以在同一个data.Now调用中读取文件content.how,可以从输入框中获得值。

代码语言:javascript
复制
@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;

}

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-02-03 08:55:04

首先,您需要理解请求的内容。如果您查看发送的请求(firebug或其他东西),您将看到以下内容:

代码语言:javascript
复制
-----------------------------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,如下所述:

代码语言:javascript
复制
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())) {
        (...)
    }
    (...)
}

希望能帮上忙,蒂埃里

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28292523

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档