我试图通过REST API将文件发送到服务器。该文件可能具有任何类型,但它的大小和类型可以限制为可作为电子邮件附件发送的内容。如何通过REST API发送文件?
我认为我的做法是将文件作为二进制流发送,然后在文件到达服务器时将其保存回文件。有没有内置的方式来在.Net中做到这一点,或者我需要手动将文件内容转换为数据流并发送?
为了清楚起见,我可以控制客户端和服务器代码,所以我不受限于任何特定的方法。
我试图通过REST API将文件发送到服务器。该文件可能具有任何类型,但它的大小和类型可以限制为可作为电子邮件附件发送的内容。如何通过REST API发送文件?
我认为我的做法是将文件作为二进制流发送,然后在文件到达服务器时将其保存回文件。有没有内置的方式来在.Net中做到这一点,或者我需要手动将文件内容转换为数据流并发送?
为了清楚起见,我可以控制客户端和服务器代码,所以我不受限于任何特定的方法。
我建议你看看RestSharp
http://restsharp.org/
RestSharp库具有将文件发布到REST服务的方法。 (RestRequst.AddFile()
)。我相信在服务器端,这会将编码字符串转换成正文,头文件中的内容类型指定文件类型。
我也看到它通过将流转换为base-64字符串并将其作为序列化的json/xml对象的属性之一进行传输。特别是如果您可以设置大小限制并希望将请求中的文件元数据作为同一对象的一部分包含在内,那么这非常有效。
它确实取决于你的文件有多大。如果它们非常大,你需要考虑流式传输,其中的细微差别在这篇SO文章中有详细介绍:How do streaming resources fit within the RESTful paradigm?
这正是我所需要的,这要归功于正确的方向。 –
我不知道你的意思是数字4。“使用现成的图书馆”是什么意思?我会研究另一个问题,当我在前面寻找答案时,我没有看到。 –
有几个现成的开箱即用的库,用于在.NET中上传文件 其中有几个是: https://msdn.microsoft.com/en-us/library/system.web.ui .webcontrols.fileupload(v = vs.110).aspx https://www.nuget.org/packages/AjaxUploader/ –
您可以将它作为POST请求发送到服务器,将文件作为FormParam传递。
@POST
@Path("/upload")
//@Consumes(MediaType.MULTIPART_FORM_DATA)
@Consumes("application/x-www-form-urlencoded")
public Response uploadFile(@FormParam("uploadFile") String script, @HeaderParam("X-Auth-Token") String STtoken, @Context HttpHeaders hh) {
// local variables
String uploadFilePath = null;
InputStream fileInputStream = new ByteArrayInputStream(script.getBytes(StandardCharsets.UTF_8));
//System.out.println(script); //debugging
try {
uploadFilePath = writeToFileServer(fileInputStream, SCRIPT_FILENAME);
}
catch(IOException ioe){
ioe.printStackTrace();
}
return Response.ok("File successfully uploaded at " + uploadFilePath + "\n").build();
}
private String writeToFileServer(InputStream inputStream, String fileName) throws IOException {
OutputStream outputStream = null;
String qualifiedUploadFilePath = SIMULATION_RESULTS_PATH + fileName;
try {
outputStream = new FileOutputStream(new File(qualifiedUploadFilePath));
int read = 0;
byte[] bytes = new byte[1024];
while ((read = inputStream.read(bytes)) != -1) {
outputStream.write(bytes, 0, read);
}
outputStream.flush();
}
catch (IOException ioe) {
ioe.printStackTrace();
}
finally{
//release resource, if any
outputStream.close();
}
return qualifiedUploadFilePath;
}
建立在@ MutantNinjaCodeMonkey的RestSharp建议。我的使用案例将来自jquery的$.ajax
方法的webform
数据发布到web api
控制器中。 restful API服务需要将上传的文件添加到请求正文中。上面提到的AddFile
的默认restsharp方法导致了错误The request was aborted: The request was canceled
。下面的初始化工作:
// Stream comes from web api's HttpPostedFile.InputStream
(HttpContext.Current.Request.Files["fileUploadNameFromAjaxData"].InputStream)
using (var ms = new MemoryStream())
{
fileUploadStream.CopyTo(ms);
photoBytes = ms.ToArray();
}
var request = new RestRequest(Method.PUT)
{
AlwaysMultipartFormData = true,
Files = { FileParameter.Create("file", photoBytes, "file") }
};
什么_“将文件序列化为二进制”_是什么意思?所有文件都已经二进制。你在问什么_exactly_?参见[如何接受文件POST - ASP.Net MVC 4 WebAPI](http://stackoverflow.com/questions/10320232/how-to-accept-a-file-post-asp-net-mvc-4-webapi )为一些起点。 – CodeCaster
你是对的,序列化是讨论它的错误方式,我的意思是我需要直接发送二进制数据流,或使用不同的工具发送给我。我澄清了这个问题,@ MutantNinjaCodeMonkey的答案是我需要的 –