spring boot multipartFile mit application/octet-stream wirft exception
Wollte ich bauen eine einfache Rest-api mit Spring boot, die akzeptiert jede gegebene Datei und führt dann einige Aktionen auf Sie . Ich ging durch die Feder-Beispiele auf multipartFile https://spring.io/guides/gs/uploading-files/ und ich beschlossen, den gleichen Ansatz Folgen. Die Dateien, die hochgeladen wird, durch meine rest-api haben einige spezifische Erweiterung. Also gab ich den content-type wie application/octet-stream . Wenn ich versuche zu laufen, meine unit-test-Fällen für die gleichen,
Ich bekomme immer die Ausnahme von
nested exception is org.springframework.web.multipart.MultipartException: The current request is not a multipart request
Diese Ausnahme wird nicht angezeigt, wenn der content-type ist text/plain, oder wenn es nicht 'verbraucht' - parameter in der requestMapping.
Mein controller code sieht wie folgt aus :
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RequestPart;
import org.springframework.web.multipart.MultipartFile;
@Controller
@RequestMapping("/v1/sample")
public class SampleController {
private static Logger log = LoggerFactory.getLogger(SampleController.class);
@RequestMapping(path = "/{id}/upload",
consumes = {MediaType.APPLICATION_OCTET_STREAM_VALUE},
method = RequestMethod.POST)
public ResponseEntity<String> uploadfile(@PathVariable String id,
@RequestParam("file") MultipartFile upgradeFile) {
log.info("Obtained a upload request for the id {}",id );
return new ResponseEntity<String>("file upload has been accepted.",
HttpStatus.ACCEPTED);
}
}
Und mein unit-test-Code ist wie folgt :
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.fileUpload;
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
import static org.springframework.test.web.servlet.setup.MockMvcBuilders.webAppContextSetup;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import org.junit.Before;
import org.junit.Ignore;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.SpringApplicationConfiguration;
import org.springframework.http.MediaType;
import org.springframework.mock.web.MockMultipartFile;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.springframework.test.context.web.WebAppConfiguration;
import org.springframework.test.web.servlet.MockMvc;
import org.springframework.web.context.WebApplicationContext;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
import com.stellapps.devicemanager.fota.Application;
@RunWith(SpringJUnit4ClassRunner.class)
@WebAppConfiguration
@SpringApplicationConfiguration(classes = Application.class)
@EnableWebMvc
public class ControllerTest {
@Autowired
private WebApplicationContext webApplicationContext;
private MockMvc mockMvc;
@Before
public void mockMvcBuilder() {
this.mockMvc = webAppContextSetup(webApplicationContext).build();
}
@Test
public void test_ValidPayload() {
String uri = "/v1/sample/1234/upload";
Path path = Paths.get("src/test/resources/someFile");
try {
byte[] bytes = Files.readAllBytes(path);
MockMultipartFile multipartFile =
new MockMultipartFile("file", "someFile.diff", "application/octet-stream", bytes);
mockMvc.perform(fileUpload(uri).file(multipartFile).contentType(MediaType.APPLICATION_OCTET_STREAM_VALUE))
.andExpect(status().isAccepted());
} catch (IOException e1) {
//TODO Auto-generated catch block
e1.printStackTrace();
} catch (Exception e) {
//TODO Auto-generated catch block
e.printStackTrace();
}
}
}
Wenn ich text/plain content-type, und ich gebe eine normale text-Datei, geht es gut durch. Wenn ich den content-type wie application/octet-stream wirft es die folgende Ausnahme
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:192)
Caused by: org.springframework.web.multipart.MultipartException: The current request is not a multipart request
at org.springframework.web.servlet.mvc.method.annotation.RequestPartMethodArgumentResolver.assertIsMultipartRequest(RequestPartMethodArgumentResolver.java:204)
at org.springframework.web.servlet.mvc.method.annotation.RequestPartMethodArgumentResolver.resolveArgument(RequestPartMethodArgumentResolver.java:129)
at org.springframework.web.method.support.HandlerMethodArgumentResolverComposite.resolveArgument(HandlerMethodArgumentResolverComposite.java:99)
at org.springframework.web.method.support.InvocableHandlerMethod.getMethodArgumentValues(InvocableHandlerMethod.java:161)
at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:128)
at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:110)
at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:817)
at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:731)
at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:85)
at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:959)
at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:893)
at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:968)
Wie Mache ich meine Anfrage akzeptieren application/octet-stream und welche änderungen sollte ich machen, um den test-Fall sicherzustellen, dass es gelingt.
UPDATE:
Entfernen der verbraucht header und nicht die Angabe des content-type-in MockPartFile ist eine Möglichkeit, eine Datei hochzuladen. Ich nehme an, standardmäßig der controller nimmt es als application/octet-stream
UPDATE:
Danke für die Antwort. Ich war mit einer früheren version von spring (1.3.1) und nach Durchlaufen die Antwort, ich aktualisiert mein spring-version und die test-Fall-zu-match, und es begann zu arbeiten.
MockMvc
einrichten? Was macht Ihr multipart-Konfiguration Aussehen?Auch, warum erwartest du einen bad request? Einige Dinge, die hier nicht Auschecken, editieren Sie bitte Ihre Frage mit den geforderten details.
InformationsquelleAutor Raveesh Sharma | 2016-10-26
Du musst angemeldet sein, um einen Kommentar abzugeben.
Versuchen Sie folgenden Schritte
MockMultipartFile multipartFile = new MockMultipartFile("file","somename","multipart/form-data", fileinputstream);
Änderung MockMvc:
Für die Hilfe schauen
Datei hochladen mit Spring mvc und MockMVC
EDIT:
Habe ich versucht, ein Beispiel spring-boot-rest-app mit Ihrem Szenario. Scheint application/octet-stream ist kein Problem. Bitte überprüfen Sie mein repo
https://github.com/satya-j/boot-file-manager
Mein Vorschlag, die Frage ist auf der Grundlage der Datei-Upload-Mechanismen, die ich habe mit. Alles was ich tun kann ist der Punkt, an link [link]stackoverflow.com/a/33033540/7063373 . Das Szenario für die meisten Datei-Upload übermitteln, die über ein Formular mit einigen zusätzlichen Daten , so multipart/form-data
Wenn Sie glauben, ein Beitrag ist ein Duplikat, flag, um es zu schließen als solche. Deine Antwort derzeit inspiriert, kein Vertrauen. Haben Sie noch nicht jede Erklärung, warum Ihr code/Konfiguration/was auch immer nicht funktioniert und haben nicht erklärt, warum Ihre Anregungen, damit es funktioniert. Es ist eine schlechte Antwort.
Ich bin damit einverstanden, ich bin neu hier. war nicht bewusst, Kennzeichnen und noch nicht umfassend erforscht. Danke für den Hinweis it out. Würden Sie vorschlagen, mich um die Löschung meiner Antwort ?
Zuerst würde ich dir empfehlen, es zu verbessern, wenn Sie können. Siehe Wie Schreibe ich eine gute Antwort?. Wenn Sie können nicht/weiß nicht,, dann, sicher, löschen Sie es.
InformationsquelleAutor satya-j