类实例_一个单个文件上传类c_upload_one

本文介绍了一种使用PHP的move_uploaded_file()函数和$_FILES数组实现单个文件上传的方法。文章详细展示了如何设置表单、检查文件大小、验证上传状态,并最终完成文件的上传过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

<?php
/***********************move_uploaded_file()函数及$_FILES[]实现单个文件上传***********************a
*功能说明:实现单个文件上传
*建立人员:肖红阳
*建立日期:2010-07-21
*修改日期:2010-07-22
*设计思想:1.传送开关(action)打开开始处理2.判断过大?断开重新指定:继续3.文件是否传完到缓冲区?用move_uploaded_file()移动到终点位置:显示上传成功或失败
*使用说明:  
     <form name="form_upload" method="post" action="<?php echo $_SERVER['PHP_SELF'];?>" enctype="multipart/form-data">
      <input type="hidden" name="post" value="postok"/>
      <input type="file" name="u_file"/>
      <input type="submit" value="提交"/>
     </form>
     <?php
     include ('class/c_file/c_upload_one.php');  
     $up = new c_upload_one('post','postok','./pic','u_file','30',$_SERVER['PHP_SELF']);
     ?>
*******************************************/
class c_upload_one{
public $action;     //传送开关名在表单中的name值
public $path;     //上传的目的路径
public $filename;    //上传的文件名
public $maxsize;    //文件最大容量数值以m兆为单位

function __construct($action,$actionvalue,$path,$filename,$maxsize,$location){
   $this->action=$action;       //传送开关名在表单中的name值
   $this->actionvalue=$actionvalue;    //传送开关名的value值
   $this->path=$path;        //上传的目的路径
   $this->filename=$filename;      //上传表单中的type为file的name值
   $this->maxsize_toB = $maxsize*1048576 ;   //文件最在值以B为单位值
   $this->maxsize_toM= $maxsize;     //文件最在值以m为单位值
   $this->location = $location;     //上传完成后转向的地址

   $this->upload();
}

function upload(){
   if(!is_dir($this->path)){ echo "<script>alert('目录".$this->path."不存在');history.back();</script>";}

   if($_POST[$this->action]==$this->actionvalue)              //判断传送开关是否触发
   {
    if($_FILES[$this->filename][size]>$this->maxsize_toB){           //判断文件是否过大
     echo " <script>alert('该文件过大请选择小于".$this->maxsize_toM."M的文件'); </script>";
    }
    else if($_FILES[$this->filename][tmp_name]){
     //$path=$this->path;
     move_uploaded_file($_FILES[$this->filename][tmp_name],$this->path.$_FILES[$this->filename][name]);//将文件从缓存中移到目标文件夹  
     $path=$this->path."/";
     echo "<script>alert('上传成功');window.location='".$this->location.
       "?path=".$path."&& filename=". $_FILES[$this->filename][name] ."';</script>";//以get方式返回目录及文件名称以供它用  
    
    }
    else echo "<script>alert('上传失败');history.back();</script>";
   }

}

function filename(){
   echo $this->filename;
}
}
?>

Cannot construct instance of `java.util.ArrayList` (although at least one Creator exists): no String-argument constructor/factory method to deserialize from String value ('http://stscpics.sshh668.top//profile/upload/2025/03/18/1742290441165_mmexport1742290315021_20250318173710A002.jpg,http://stscpics.sshh668.top//profile/upload/2025/03/18/1742290446624_mmexport1742290322072_20250318173710A003.jpg,http://stscpics.sshh668.top//profile/upload/2025/03/18/1742290451593_mmexport1742290331419_20250318173710A004.jpg,http://stscpics.sshh668.top//profile/upload/2025/03/18/mmexport1742290335829_20250318173711A005.jpg,http://stscpics.sshh668.top//profile/upload/2025/03/18/1742290466944_mmexport1742290344461_20250318173711A006.jpg,http://stscpics.sshh668.top//profile/upload/2025/03/18/1742290472705_mmexport1742290346821_20250318173711A007.jpg,http://stscpics.sshh668.top//profile/upload/2025/03/18/mmexport1742290349002_20250318173711A008.jpg,http://stscpics.sshh668.top//profile/upload/2025/03/18/1742290484460_mmexport1742290351136_20250318173712A009.jpg'); nested exception is com.fasterxml.jackson.databind.exc.MismatchedInputException: Cannot construct instance of `java.util.ArrayList` (although at least one Creator exists): no String-argument constructor/factory method to deserialize from String value ('http://stscpics.sshh668.top//profile/upload/2025/03/18/1742290441165_mmexport1742290315021_20250318173710A002.jpg,http://stscpics.sshh668.top//profile/upload/2025/03/18/1742290446624_mmexport1742290322072_20250318173710A003.jpg,http://stscpics.sshh668.top//profile/upload/2025/03/18/1742290451593_mmexport1742290331419_20250318173710A004.jpg,http://stscpics.sshh668.top//profile/upload/2025/03/18/mmexport1742290335829_20250318173711A005.jpg,http://stscpics.sshh668.top//profile/upload/2025/03/18/1742290466944_mmexport1742290344461_20250318173711A006.jpg,http://stscpics.sshh668.top//profile/upload/2025/03/18/1742290472705_mmexport1742290346821_20250318173711A007.jpg,http://stscpics.sshh668.top//profile/upload/2025/03/18/mmexport1742290349002_20250318173711A008.jpg,http://stscpics.sshh668.top//profile/upload/2025/03/18/1742290484460_mmexport1742290351136_20250318173712A009.jpg')
最新发布
03-19
<think>好的,我现在需要解决用户遇到的这个Jackson反序列化错误。错误信息显示无法构造ArrayList的实例,因为没有接受字符串参数的构造函数或工厂方法。用户提供的示例数据是一个由逗号分隔的多个URL字符串,看起来像是试图将一个字符串解析成ArrayList。 首先,我需要理解这个问题的根本原因。Jackson在反序列化时,如果目标型是集合(比如ArrayList),它期望输入是一个JSON数组,例如用方括号括起来的多个元素。例如,正确的JSON数组应该是这样的:["url1", "url2", "url3"]。但用户提供的数据看起来像是一个用逗号分隔的长字符串,没有方括号,这会导致Jackson无法识别为一个数组,从而抛出异常。 接下来,我需要考虑可能的解决方案。用户可能正在尝试将一个单独的字符串反序列化为ArrayList,而这个字符串内部是用逗号分隔的多个URL。这时候,Jackson会尝试寻找一个接受字符串参数的构造函数或工厂方法,但ArrayList没有这样的构造方式,所以会报错。 解决方法可能有几种: 1. **调整数据格式**:确保发送的JSON数据是正确的数组格式,即用方括号包围,每个URL作为独立的字符串元素。这样Jackson就能正确解析为ArrayList。 2. **自定义反序列化器**:如果无法修改数据格式,可以编写一个自定义的反序列化器,将逗号分隔的字符串分割成列表。这需要注册到ObjectMapper中,并在相应的字段上使用注解指定自定义的反序列化器。 3. **修改接收对象的字段型**:如果字段原本是List<String>,但数据是字符串,可能需要将字段型改为String,然后在代码中手动分割。不过这可能不符合原有设计,需要权衡。 另外,可能还需要检查后端代码,确认接收参数的实体是否正确使用了@RequestBody或其他相关注解,确保Jackson被正确调用来处理反序列化。 例如,如果实体中的字段定义为: ```java private List<String> urls; ``` 而接收到的数据是单个字符串,那么就会出现这个问题。解决方法是确保客户端发送的是JSON数组,或者在服务端对字符串进行分割处理。 总结来说,关键问题在于数据格式与目标型不匹配。需要确保两端的数据结构一致,或者通过自定义解析逻辑来处理特殊格式的数据。</think>这个错误是Jackson库在反序列化JSON数据时发生的型不匹配问题。以下是逐步分析及解决方案: --- ### **错误原因分析** 1. **数据结构不匹配** 你的代码期望接收一个`ArrayList`型,但实际传入的数据是一个**纯字符串**而非JSON数组。 例如期望的合法JSON格式应该是: $$[ "url1", "url2", "url3" ]$$ 但实际传入的数据是: $$"url1,url2,url3"$$(单个字符串) 2. **反序列化机制限制** `ArrayList`没有接受单个字符串参数的构造函数,Jackson无法直接将逗号分隔的字符串自动转换为列表。 --- ### **解决方案** #### 方案一:修正数据格式(推荐) **确保客户端发送标准的JSON数组**: ```json [ "http://stscpics.sshh668.top//profile/upload/2025/03/18/1742290441165_mmexport1742290315021_20250318173710A002.jpg", "http://stscpics.sshh668.top//profile/upload/2025/03/18/1742290446624_mmexport1742290322072_20250318173710A003.jpg" ] ``` #### 方案二:服务端自定义反序列化 **步骤**: 1. 创建自定义反序列化器: ```java public class StringToListDeserializer extends JsonDeserializer<List<String>> { @Override public List<String> deserialize(JsonParser p, DeserializationContext ctxt) throws IOException { String value = p.getValueAsString(); return Arrays.asList(value.split(",")); } } ``` 2. 在目标字段上添加注解: ```java @JsonDeserialize(using = StringToListDeserializer.class) private List<String> urls; ``` --- #### 方案三:修改字段型(临时方案) 如果无法修改输入数据格式,可临时将字段型改为`String`,再手动拆分: ```java private String urls; // Getter中处理拆分逻辑 public List<String> getUrls() { return Arrays.asList(this.urls.split(",")); } ``` --- ### **验证示例** 假设原始JSON为: ```json { "urls": "url1,url2,url3" } ``` 使用方案二后,Jackson会将其解析为`ArrayList`包含3个元素。 --- ### **关键点总结** | 方案 | 适用场景 | 优点 | 缺点 | |------|----------|------|------| | 修正数据格式 | 可控客户端输出 | 标准化数据 | 需客户端配合 | | 自定义反序列化 | 不可改客户端数据 | 服务端自主控制 | 增加代码复杂度 | | 修改字段型 | 快速修复 | 简单直接 | 破坏原有设计 | 建议优先采用**方案一**以保证系统规范性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值