我曾经用来MultipartFormDataStreamProvider处理多部分请求.
由于我希望将上传的文件存储在内存中而不是磁盘文件中,因此我更改了要使用的代码MultipartMemoryStreamProvider.文件加载似乎工作正常,但我不再能够访问通过provider.FormData下面提供的其他表单值MultipartFormDataStreamProvider.有人能告诉我怎么做吗?
Fiddler捕获的原始请求:
POST http://myserver.com/QCCSvcHost/MIME/RealtimeTrans/ HTTP/1.1
Content-Type: multipart/form-data; boundary="XbCY"
Host: na-w-lxu3
Content-Length: 1470
Expect: 100-continue
Connection: Keep-Alive
--XbCY
Content-Type: text/plain; charset=utf-8
Content-Disposition: form-data; name=PayloadType
X12_270_Request_005010X279A1
--XbCY
Content-Type: text/plain; charset=utf-8
Content-Disposition: form-data; name=ProcessingMode
RealTime
--XbCY
Content-Type: text/plain; charset=utf-8
Content-Disposition: form-data; name=PayloadID
e51d4fae-7dec-11d0-a765-00a0c91e6fa6
--XbCY
Content-Type: text/plain; charset=utf-8
Content-Disposition: form-data; name=TimeStamp
2007-08-30T10:20:34Z
--XbCY
Content-Type: text/plain; charset=utf-8
Content-Disposition: form-data; name=SenderID
HospitalA
--XbCY
Content-Type: text/plain; charset=utf-8
Content-Disposition: form-data; name=ReceiverID
PayerB
--XbCY
Content-Type: text/plain; charset=utf-8
Content-Disposition: form-data; name=CORERuleVersion …Run Code Online (Sandbox Code Playgroud) 有关处理使用FormData上载到ASP.NET WebAPI处理程序的文件的所有文档/教程/问题MultipartFormDataStreamProvider用于处理多部分流以将其拆分为相关的表单字段和文件.
var root = HttpContext.Current.Server.MapPath("~/App_Data");
var provider = new MultipartFormDataStreamProvider(root);
await Request.Content.ReadAsMultipartAsync(provider);
foreach (MultipartFileData file in provider.FileData)
{
// File
}
Run Code Online (Sandbox Code Playgroud)
但是,在处理期间,文件会自动写入目录.
当我可以HttpContext.Current.Request.Files[0].InputStream直接在内存中使用访问给定的文件流时,似乎有很多麻烦.
WebAPI如何直接访问文件流而无需使用IO开销MultipartFormDataStreamProvider?
官方教程:http://www.asp.net/web-api/overview/advanced/sending-html-form-data,-part-2
我正在使用基于Jersey的restful Service实施策略来构建将用于上传文件的服务.我的服务类名是:UploadFileService.java(参见下面的代码)
package com.jerser.service;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import javax.ws.rs.Consumes;
import javax.ws.rs.POST;
import javax.ws.rs.Path;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;
import com.sun.jersey.core.header.FormDataContentDisposition;
import com.sun.jersey.multipart.FormDataParam;
@Path("/fileUpload")
public class UploadFileService {
@POST
@Path("/upload")
@Consumes(MediaType.MULTIPART_FORM_DATA)
public Response uploadFile(
@FormDataParam("file") InputStream uploadedInputStream,
@FormDataParam("file") FormDataContentDisposition fileDetail) {
String uploadedFileLocation = "d://uploaded/" + fileDetail.getFileName();
// save it
writeToFile(uploadedInputStream, uploadedFileLocation);
String output = "File uploaded to : " + uploadedFileLocation;
return Response.status(200).entity(output).build();
}
// save uploaded file to new location
private void writeToFile(InputStream …Run Code Online (Sandbox Code Playgroud) 我试图file通过jQuery.Form插件提交一个带有字段的表单,这里是代码:
$('form').ajaxSubmit({
url: "/path",
dataType: "json",
contentType: "multipart/form-data"
...
Run Code Online (Sandbox Code Playgroud)
然后服务器返回json作为响应.在除IE之外的所有浏览器中都很好用,它试图将响应下载为文件.如果我从表单中删除文件字段,它也可以正常工作.
我在这里和谷歌已经看到了各种解决方案,基本上几乎尝试了所有描述的内容,包括enctype通过jQuery 设置表单,但它没有用.
任何建议都会受到欢迎.
我不知道html是如何工作的.我想要做的是与以下内容完全类似,但在android上
<body>
<form action="<%= some_url %>" method="post" enctype="multipart/form-data">
<input type="file" name="myFile">
<input type="submit" value="Submit">
</form>
</body>Run Code Online (Sandbox Code Playgroud)
我尝试了以下代码 -
private static void postToUrl(String url_to_upload_on,
String file_name_with_ext, byte[] byteArray) {
String attachmentName = "file";
String attachmentFileName = file_name_with_ext;
String crlf = "\r\n";
String twoHyphens = "--";
String boundary = "*****";
try{
URL url = new URL(url_to_upload_on);
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
connection.setDoOutput(true);
connection.setRequestMethod("POST");
connection.setRequestProperty(
"Content-Type", "multipart/form-data;boundary=" + boundary);
DataOutputStream request = new DataOutputStream(
connection.getOutputStream());
request.writeBytes(twoHyphens + boundary + crlf);
request.writeBytes("Content-Disposition: form-data; …Run Code Online (Sandbox Code Playgroud) 我正在使用Spring 3和RestTemplate.我基本上有两个应用程序,其中一个必须将值发布到另一个应用程序.通过休息模板.
当要发布的值是字符串时,它的工作完美,但是当我必须发布混合和复杂的参数(如MultipartFiles)时,我会得到转换器异常.
例如,我有这个:
App1 - PostController:
@RequestMapping(method = RequestMethod.POST)
public String processSubmit(@ModelAttribute UploadDTO pUploadDTO,
BindingResult pResult) throws URISyntaxException, IOException {
URI uri = new URI("http://localhost:8080/app2/file/receiver");
MultiValueMap<String, Object> mvm = new LinkedMultiValueMap<String, Object>();
mvm.add("param1", "TestParameter");
mvm.add("file", pUploadDTO.getFile()); // MultipartFile
Map result = restTemplate.postForObject(uri, mvm, Map.class);
return "redirect:postupload";
}
Run Code Online (Sandbox Code Playgroud)
另一方面......我有另一个Web应用程序(App2)从App1接收参数.
App2 - ReceiverController
@RequestMapping(value = "/receiver", method = { RequestMethod.POST })
public String processUploadFile(
@RequestParam(value = "param1") String param1,
@RequestParam(value = "file") MultipartFile file) {
if (file == null) {
System.out.println("Shit!... …Run Code Online (Sandbox Code Playgroud) 我知道有很多关于此的问题,但我无法让这个工作:
我想在multipart/form-data中将文件从输入上传到服务器
我尝试了两种方法.第一:
headers: {
'Content-Type': undefined
},
Run Code Online (Sandbox Code Playgroud)
这导致例如图像
Content-Type:image/png
Run Code Online (Sandbox Code Playgroud)
而它应该是multipart/form-data
和另外一个:
headers: {
'Content-Type': multipart/form-data
},
Run Code Online (Sandbox Code Playgroud)
但这要求一个边界标题,我相信不应该手动插入...
什么是解决这个问题的干净方法?我读过你能做到的
$httpProvider.defaults.headers.post['Content-Type'] = 'multipart/form-data; charset=utf-8';
Run Code Online (Sandbox Code Playgroud)
但我不希望我的所有帖子都是multipart/form-data.默认值应为JSON
我正在使用ASP.NET Web API上传文件.我在RC之前做过这个,但由于某种原因,文件被保存为"BodyPart_3ded2bfb-40be-4183-b789-9301f93e90af"而不是文件名.下面的filename变量也会返回此bodypart字符串而不是文件名.我似乎无法弄清楚我哪里出错了.任何帮助表示赞赏.
客户代码:
function upload() {
$("#divResult").html("Uploading...");
var formData = new FormData($('form')[0]);
$.ajax({
url: 'api/files/uploadfile?folder=' + $('#ddlFolders').val(),
type: 'POST',
success: function (data) {
$("#divResult").html(data);
},
data: formData,
cache: false,
contentType: false,
processData: false
});
};
Run Code Online (Sandbox Code Playgroud)
控制器:
public Task<HttpResponseMessage> UploadFile([FromUri]string folder)
{
if (!Request.Content.IsMimeMultipartContent())
{
throw new HttpResponseException(Request.CreateResponse(HttpStatusCode.UnsupportedMediaType));
}
// Save file
MultipartFormDataStreamProvider provider = new MultipartFormDataStreamProvider(HttpContext.Current.Server.MapPath("~/Files"));
Task<IEnumerable<HttpContent>> task = Request.Content.ReadAsMultipartAsync(provider);
return task.ContinueWith<HttpResponseMessage>(contents =>
{
string filename = provider.BodyPartFileNames.First().Value;
return new HttpResponseMessage()
{
Content = new StringContent(string.Format("File saved in {0}.", …Run Code Online (Sandbox Code Playgroud) 我正在尝试向服务器发送多部分请求,但我收到以下异常HTTP状态500 - 请求处理失败; 嵌套异常是org.springframework.web.multipart.MultipartException:当前请求不是多部分请求
<div id="myModal" class="modal hide fade" tabindex="-1" role="dialog" aria-labelledby="myModalLabel" aria-hidden="true">
<div class="modal-body">
<form id="imageuploadForm" action="<c:url value="/members/profileimageupload" />" method="POST" enctype="multipart/form-data">
<div style="width:40%; float:left">
<div class="fileupload fileupload-new" data-provides="fileupload">
<div class="fileupload-preview thumbnail" style="width: 200px; height: 150px;"></div>
<div>
<span class="btn btn-file">
<span class="fileupload-new">Select image</span>
<span class="fileupload-exists">Change</span>
<input id="imageFile" name="imageFile" type="file" />
</span>
<a href="#" class="btn fileupload-exists" data-dismiss="fileupload">Remove</a>
</div>
</div>
</div>
<div style="width:40%; float:right" >
<div class="progress">
<div class="bar" style="width: 60%;"></div>
</div>
</div>
</form>
</div>
<div class="modal-footer">
<button class="btn btn-success" id="submit">Upload</button>
<button …Run Code Online (Sandbox Code Playgroud) 我有一个像这样的控制器,我想提交一个包含文件上传的表格以及一些表格数据,如下图所示.另外,我想使用@RequestBody这样做,所以我可以在包装器上使用@Valid注释,因为会添加更多变量.
public @ResponseBody WebResponse<Boolean> updateEUSettings(
final Locale locale,
@Validated @ModelAttribute final EUPSettingsWrapper endUserPortalSettingsWrapper) {
}
Run Code Online (Sandbox Code Playgroud)
我的包装是:
public class EUPSettingsWrapper {
private String label;
private MultipartFile logo;
// getter , setters..etc...
}
Run Code Online (Sandbox Code Playgroud)
但我想将它从ModelAttributes转换为@RequestBody.
我正在尝试的方法是将文件上传分隔为请求参数,如下所示:
public @ResponseBody WebResponse<Boolean> updateEUSettings(
final Locale locale,
@Validated @RequestBody final EUPSettingsWrapper endUserPortalSettingsWrapper,
@RequestParam(value = "file1", required = true) final MultipartFile logo) {
endUserPortalSettingsWrapper.setLogo(logo);
// ...
}
Run Code Online (Sandbox Code Playgroud)
在我的模拟MVC中,我正在设置:
getMockMvc().perform(fileUpload(uri).file(logo)
.accept(MediaType.APPLICATION_JSON)
.content(JSONUtils.toJSON(wrapper))
.contentType(MediaType.MULTIPART_FORM_DATA))
.andExpect(status().isOk());
Run Code Online (Sandbox Code Playgroud)
但我收到的错误是这样的:
org.springframework.web.HttpMediaTypeNotSupportedException: Content type 'multipart/form-data' not supported
Run Code Online (Sandbox Code Playgroud)
有没有人知道如何将Multipart文件上传与@RequestBody一起使用?我上面做错了什么?
spring-mvc ×3
file ×2
http ×2
ajax ×1
android ×1
angularjs ×1
asp.net ×1
asp.net-mvc ×1
blobstore ×1
c# ×1
file-upload ×1
http-headers ×1
java ×1
jersey ×1
jersey-2.0 ×1
jqueryform ×1
json ×1
multipart ×1
rest ×1
resttemplate ×1
spring ×1