【问题标题】:Uploading image using SpringMVC 4.0 Multipart使用 Spring MVC 4.0 Multipart 上传图片
【发布时间】:2014-08-13 12:56:44
【问题描述】:

我正在尝试使用以下代码在线上传图片。但是,由于某种原因,图像似乎没有在图像文件夹中创建。不确定,我在这里做错了什么。

@RequestMapping(value="/add", method=RequestMethod.POST)
public String processAddNewProductForm(@ModelAttribute("newProduct") Product productToBeAdded, BindingResult result, HttpServletRequest request) {
    String[] supressedFields = result.getSuppressedFields();
    if(supressedFields.length > 0) {
        throw new RuntimeException("Attempting to bind disallowed fields: " + StringUtils.arrayToCommaDelimitedString(supressedFields));
    }

    MultipartFile productImage = productToBeAdded.getProductImage();

    String rootDirectory = request.getSession().getServletContext().getRealPath("/");
    if (productImage!=null && !productImage.isEmpty()) {
      try {
        productImage.transferTo(new File(rootDirectory+"resources\\images\\"+ productToBeAdded.getProductId() + ".png"));
        } catch (Exception e) {
          throw new RuntimeException("Product Image saving failed", e);
        }
    }


    productService.addProduct(productToBeAdded);
    return "redirect:/products/";

}

dispatcherservlet

<bean id="multipartResolver"
    class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
    <property name="maxUploadSize" value="10240000" />
</bean>

Product.java

 public class Product {

private String productId;
private String name;
private BigDecimal unitPrice;
private String description;
private String manufacturer;
private String category;
private long unitsInStock;
private long unitsInOrder;
private boolean discontinued;
private String condition;
private MultipartFile productImage;


public Product() {
super();
}

public Product(String productId, String name, BigDecimal unitPrice) {
this.productId = productId;
this.name = name;
this.unitPrice = unitPrice;
}

// add setters and getters for all the fields here

public MultipartFile getProductImage() {
return productImage;
}

public void setProductImage(MultipartFile productImage) {
this.productImage = productImage;
}

public String getProductId() {
return productId;
}

public void setProductId(String productId) {
this.productId = productId;
}

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}

public BigDecimal getUnitPrice() {
return unitPrice;
}

public void setUnitPrice(BigDecimal unitPrice) {
this.unitPrice = unitPrice;
}

public String getDescription() {
return description;
}

public void setDescription(String description) {
this.description = description;
}

public String getManufacturer() {
return manufacturer;
}

public void setManufacturer(String manufacturer) {
this.manufacturer = manufacturer;
}

public String getCategory() {
return category;
}

public void setCategory(String category) {
this.category = category;
}

public long getUnitsInStock() {
return unitsInStock;
}

public void setUnitsInStock(long unitsInStock) {
this.unitsInStock = unitsInStock;
}

public long getUnitsInOrder() {
return unitsInOrder;
}

public void setUnitsInOrder(long unitsInOrder) {
this.unitsInOrder = unitsInOrder;
}

public boolean isDiscontinued() {
return discontinued;
}

public void setDiscontinued(boolean discontinued) {
this.discontinued = discontinued;
}

public String getCondition() {
return condition;
}

public void setCondition(String condition) {
this.condition = condition;
}

product.jsp

  <div class="col-md-5"> <img src="<c:url value="/resources/images/${product.productId}.png">           </c:url>" alt="image" style="width: 100%" />

【问题讨论】:

  • 你对你的配置什么也没说,你没有说你是否已经在应用程序的任何其他部分成功使用了 multipart,你甚至没有显示生成它的表单......配置错误可能是任何地方:阅读 Spring 参考手册,按照它进行工作配置,如果它不起作用,请再次询问。
  • 您使用MultipartResolver 的什么实现(CommonsMultipartResolverStandardServletMultipartResolver)?对于web.xml 的最后一部分应该张贴。发布Product 类和适当形式的代码也可能很有用。
  • 确保运行程序的用户对包含图像的目录具有可写权限。还要检查该用户是否对该目录的所有父级具有可读/可执行权限。如果没有帮助,我建议在您的 IDE 中调试 MultipartFile.transferTo() 方法。

标签: spring-mvc image-uploading


【解决方案1】:

可能还有很多问题。

首先,您将解析器命名为 multipartResolver。除非您专门配置了 MultipartFilter,否则它会在名称 filterMultipartResolver 下查找它。

接下来,您在 dispatcherservlet 中配置了解析器。即使过滤器是 Web 元素,它也独立于任何 servlet 并使用根应用程序上下文。

即使你没有显示它,我想你在web.xml文件中配置了一个MultipartFilter

您似乎只是将MultipartFile 添加到您的Product。根据 javadoc ,如果需要,用户负责将文件内容复制到会话级别或持久存储。临时存储将在请求处理结束时被清除。你应该使用类似的东西:

private byte[] image;

public void setProductImage(MultipartFile productImage) {
    image = productImage.getBytes();
}

如果您想将图像存储在产品中。否则,您应该将其传输到文件 (File dest = ...; productImage.tranferTo(dest);) 并将名称存储在产品中。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-12-02
    • 2015-10-11
    • 1970-01-01
    • 1970-01-01
    • 2016-04-25
    • 2014-12-04
    • 1970-01-01
    相关资源
    最近更新 更多