سؤال

أحاول كتابة اختبار وحدة لمعالجة وحدة تحكم تحميل الملف باستخدام Spring 3. الآن إذا أرسلت الصورة إلى طريقة الخدمة الخاصة بي من خلال وحدة التحكم ، كل شيء يعمل بشكل جيد. ولكن عند إجراء اختبارات وحدة مستقيمة ، أحصل على استثناء مؤشر فارغ.

يبدو أن الخاصية "DFOs" داخل DiskFilteItem يكون فارغًا عندما أقوم بتثبيته يدويًا ولكن يتم ملؤه عند استرداد أ MultipartFile من وحدة التحكم.

    File file = new File("//Users//test//Downloads//testimage.jpg");
    log.info("found file: " +file.exists());
    log.info("file size: " +file.length());
    String fieldName = "field";
    String contentType = "image/jpeg";
    boolean isFormField = false;
    String fileName = "testimage.jpg";
    int sizeThreshold = 10240;

    DiskFileItemFactory factory = new DiskFileItemFactory();

    DiskFileItemFactory factory = new DiskFileItemFactory();
    // throws null pointer
    FileItem fi = factory.createItem(fieldName,contentType,isFormField,fileName);

    // so does this one
    DiskFileItem item = new DiskFileItem(fieldName, contentType, isFormField, fileName, sizeThreshold, file);
    MultipartFile f = new CommonsMultipartFile(item);

أشعر أنني أفتقد شيئًا سخيفًا في الإعداد. يحتوي ملف POM الخاص بي على التبعيات التالية.

    <dependency>
        <groupId>commons-fileupload</groupId>
        <artifactId>commons-fileupload</artifactId>
        <version>1.2.2</version>
    </dependency>
    <dependency>
        <groupId>commons-io</groupId>
        <artifactId>commons-io</artifactId>
        <version>2.0</version>
    </dependency>

يلقي هذا الرمز تتبع المكدس التالي

java.lang.NullPointerException
 at org.apache.commons.fileupload.disk.DiskFileItem.getSize(DiskFileItem.java:316)
 at org.springframework.web.multipart.commons.CommonsMultipartFile.(CommonsMultipartFile.java:60)
 at ImgurClientTest.testUploadImage(ImgurClientTest.java:58)
 at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
 at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
 at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
 at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:44)
 at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:15)
 at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:41)
 at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:20)
 at org.springframework.test.context.junit4.statements.RunBeforeTestMethodCallbacks.evaluate(RunBeforeTestMethodCallbacks.java:74)
 at org.springframework.test.context.junit4.statements.RunAfterTestMethodCallbacks.evaluate(RunAfterTestMethodCallbacks.java:82)
 at org.springframework.test.context.junit4.statements.SpringRepeat.evaluate(SpringRepeat.java:72)
 at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:240)
 at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:50)
 at org.junit.runners.ParentRunner$3.run(ParentRunner.java:193)
 at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:52)
 at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:191)
 at org.junit.runners.ParentRunner.access$000(ParentRunner.java:42)
 at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:184)
 at org.springframework.test.context.junit4.statements.RunBeforeTestClassCallbacks.evaluate(RunBeforeTestClassCallbacks.java:61)
 at org.springframework.test.context.junit4.statements.RunAfterTestClassCallbacks.evaluate(RunAfterTestClassCallbacks.java:70)
 at org.junit.runners.ParentRunner.run(ParentRunner.java:236)
 at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.run(SpringJUnit4ClassRunner.java:180)
 at org.junit.runner.JUnitCore.run(JUnitCore.java:157)
 at com.intellij.rt.execution.junit.JUnitStarter.main(JUnitStarter.java:65)
هل كانت مفيدة؟

المحلول

وقعت في نفس المشكلة. القضية هي ذلك DiskFileItem.getSize() يقترن مؤقتا مع DiskFileItem.getOutputStream() في هذا الحقل الداخلي تتم تهيئة في getOutputStream ويستخدم في getSize.

الحل هو القيام به

final File TEST_FILE = new File("src/test/resources/test.jpg");
final DiskFileItem diskFileItem = new DiskFileItem("file", "image/jpeg", true, TEST_FILE.getName(), 100000000, TEST_FILE.getParentFile());
diskFileItem.getOutputStream();

قبل المرور diskFileItem إلى مُنشئ CommonsMultipartFile.

نصائح أخرى

ماذا يقول هذا الجزء من هذا السجل؟

log.info("found file: " +file.exists());
log.info("file size: " +file.length());

لكنني أعتقد أن المشكلة قد تكون بسبب هذا:

File file = new File("//Users//test//Downloads//");

يبدو أنه يشير إلى دليل بدلاً من ملف ، لذلك ربما هذا هو السبب في أنك تحصل على ملف NullPointerException عندما تريد الحصول على حجم DiskFileItem

وإذا كان أي من الحلول أعلاه يعمل من أجلك كما حدث بالنسبة لي :) ببساطة التخلص من DiskfileItem واستخدم الحل المربع:

  final File fileToUpload = new File("src/test/resources/files/test.txt");
  final MultiValueMap<String, Object> request = new LinkedMultiValueMap<String, Object>();
  request.add("file", new FileSystemResource(fileToUpload.getAbsolutePath()));

وإن لم يكن مرتبطا تماما بالسؤال. واجهت نفس الاستثناء عند نشر بعض رمز التحميل إلى GAE. لقد قمت بتعديل رمز SystemPuntoout من هنا باستخدام Apache FileUpload على GAE (الذي يستخدم جزء التيارات من Apache Commons) التي عملت بعد ذلك بشكل جيد.

new DiskFileItem(fieldName, contentType, isFormField, fileName, sizeThreshold, file);

ينتج عنه null القيمة. انظر إلى مستندات لمعرفة ما هو الخطأ أو ربما تمر ببعض null كمعلمات

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top