我正在尝试编写一个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()
在这种情况下,我最终得到一个空的输入流,没有任何东西被写出来。
我觉得我在这里缺少一些简单的东西。我做错了什么?
答案 0 :(得分:0)
您需要进行两项更改:
httppost.setHeader('Content-Type'...
。文件上传HTTP POST请求必须具有内容类型multipart/form-data
(在构造多部分HttpPost时由HttpClient自动设置)reqEntity.addPart("file", ...
更改为:reqEntity.addPart("file", new
FileBody(file))
。或者使用其他一个未弃用的FileBody
构造函数来指定有效的内容类型和字符集(API link)这假设您的file
方法参数的类型为java.io.File
- - 我从你的片段中不清楚这一点。然后,正如dmahapatro建议的那样,您应该能够阅读以下文件:request.getFile('file')