从grails中的POST请求中读取Word文件

时间:2014-01-28 15:41:25

标签: http rest grails post groovy

我正在尝试编写一个Groovy脚本,它将Word(docx)文件发布到我的grails应用程序上的REST处理程序。

请求的构造如下:

import org.apache.http.HttpEntity
import org.apache.http.HttpResponse
import org.apache.http.client.methods.HttpPost
import org.apache.http.entity.mime.MultipartEntity
import org.apache.http.entity.mime.content.FileBody
import org.apache.http.entity.mime.content.StringBody
import org.apache.http.impl.client.DefaultHttpClient

class RestFileUploader {
    def sendFile(file, filename) {

        def url = 'http://url.of.my.app';


        DefaultHttpClient httpclient = new DefaultHttpClient();
        HttpPost httppost = new HttpPost(url);


        MultipartEntity reqEntity = new MultipartEntity();
        FileBody bin = new FileBody(file);
        reqEntity.addPart("file", new FileBody((File)file, "application/msword"));

        def normalizedFilename = filename.replace(" ", "")
        reqEntity.addPart("fileName", new StringBody(normalizedFilename));

        httppost.setEntity(reqEntity);

        httppost.setHeader('X-File-Size', (String)file.size())
        httppost.setHeader('X-File-Name', filename)
        httppost.setHeader('Content-Type', 'application/vnd.openxmlformats-officedocument.wordprocessingml.document; charset=utf-8')

        println "about to post..."

        HttpResponse restResponse = httpclient.execute(httppost);
        HttpEntity resEntity = restResponse.getEntity();
        def responseXml = resEntity.content.text;

        println "posted..."
        println restResponse
        println resEntity

        println responseXml.toString()

        return responseXml.toString()

    }
}

在接收控制器上,我从请求中读取了所需的标题,然后尝试访问该文件,如下所示:

def inStream = request.getInputStream()

我最终写出了一个损坏的Word文件,并且通过检查文件大小和内容,看起来我的控制器正在写出整个请求,而不仅仅是文件。

我也试过这种方法:

def filePart = request.getPart('file')
def inStream = filePart.getInputStream()

在这种情况下,我最终得到一个空的输入流,没有任何东西被写出来。

我觉得我在这里缺少一些简单的东西。我做错了什么?

1 个答案:

答案 0 :(得分:0)

您需要进行两项更改:

  1. 删除行:httppost.setHeader('Content-Type'...。文件上传HTTP POST请求必须具有内容类型multipart/form-data(在构造多部分HttpPost时由HttpClient自动设置)
  2. 将行reqEntity.addPart("file", ...更改为:reqEntity.addPart("file", new FileBody(file))。或者使用其他一个未弃用的FileBody构造函数来指定有效的内容类型和字符集(API link)这假设您的file方法参数的类型为java.io.File - - 我从你的片段中不清楚这一点。
  3. 然后,正如dmahapatro建议的那样,您应该能够阅读以下文件:request.getFile('file')