4

我试图通过 restlet 接收文件,但只获得完整的 MULTIPART_FORM_DATA。如何提取我的特定文件?

我发现了一些代码块,但它们的类型不可用... RESTlet:如何处理多部分/表单数据请求?

DiskFileItemFactory factory = new DiskFileItemFactory();
factory.setSizeThreshold(1000240);

// 2/ Create a new file upload handler
RestletFileUpload upload = new RestletFileUpload(factory);

我当前的代码:

@Put
public void handleUpload(Representation entity) {
    if (entity !=null) {
        if (MediaType.MULTIPART_FORM_DATA.equals(entity.getMediaType(), true)) {
            Request restletRequest = getRequest();
            Response restletResponse = getResponse();
            HttpServletRequest servletRequest = ServletUtils.getRequest(restletRequest);
            HttpServletResponse servletResponse = ServletUtils.getResponse(restletResponse);

            try {
                Upload2(restletRequest, entity);
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }

public void Upload2(Request req, Representation entity) throws IOException
{
    ...
        GcsOutputChannel outputChannel = gcsService.createOrReplace(fileName, GcsFileOptions.getDefaultInstance());
        ObjectOutputStream oout = new ObjectOutputStream(Channels.newOutputStream(outputChannel)); 
        copy(entity.getStream(), oout);
        oout.close(); 

用这种方法存储后,我有类似的东西,我只想存储名为“图片”的内容:

��z------WebKitFormBoundarysOvzWKPqyqW7DiTu
Content-Disposition: form-data; name="picture"; filename="_MG_4369.jpg"
Content-Type: image/jpeg

����*ExifII*

据我所知,还不支持多部分表单数据的解析?但是必须有解决方案通过restlet发送文件

我通过邮递员为 chrome 尝试了休息电话。仅在多部分上支持文件。是否可以将图像作为原始文本发送?

4

2 回答 2

0

您应该将上传的文件作为InputStream. 然后你可以使用这个:

@Put
public void handleUpload(InputStream entity) {
}

该文件现在是它的流,并且其中不再包含表单数据。要将文件作为流发送,您可以在 java 中设置客户端(例如,使用 jersey)。

import com.sun.jersey.api.client.Client;
import com.sun.jersey.api.client.ClientResponse;
import com.sun.jersey.api.client.WebResource;

File f = new File("C:/file/to/upload.zip");
InputStream data = new FileInputStream(f);
Client client = Client.create();
client.setChunkedEncodingSize(1024);
WebResource resource = client.resource("http://localhost:80/your/uri");
ClientResponse response = resource.accept("application/x-octet-stream").type("application/x-octet-stream").post(ClientResponse.class, data);

现在您已经有了data,您可以设置一个客户端来发布data到您的服务器。我之前尝试过使用多部分表单数据和邮递员。我疯狂地试图让多部分数据工作。但这是我一直在使用的解决方案。而且效果很好。

于 2013-08-12T12:16:55.580 回答
0

在使用 org.restlet.ext.fileupload 库时,您将需要添加Exception处理和处理InputStream以及可能清理临时文件(请参阅DiskFileItemFactory文档),但基础知识如下。

@Put
public void handleUpload(Representation entity) {
    List<FileItem> items = new RestletFileUpload(new DiskFileItemFactory())
                 .parseRepresentation(representation);
    for (FileItem item : items) {
        if (!item.isFormField()) {
            MediaType type = MediaType.valueOf(item.getContentType());
            InputStream inputStream = item.getInputStream();
        }
    }
}

对于 gae 解决方案,尝试DiskFileItemFactorygwtupload.server.MemoryFileItemFactory.

于 2013-08-12T15:34:19.330 回答