浅析PHP 中move_uploaded_file 上传中文文件名失败

项目需要上传文件名保持不变,发现上传中文失败:错误如下:

move_uploaded_file(public/upload/files/2019/04-17/\开密二次开发.rar): failed to open stream: Invalid argument

失败的原因大致猜到是编码问题.保存文件时,需要将中文由utf8转为gb2312。

<?php
$files = $_FILES['attachment']; // 上传的表单附件名
$name = iconv("UTF-8", "gb2312", $files['name']);
move_uploaded_file($files['tmp_name'], "/upload/$name");

额外补充:如果大家使用Tp5 上传,文件在think/File.php.大概是374行:大多数解决办法是在下面的方法转码,但会存在问题,转码后,文件是上传成功,随后就报错:

elseif (!move_uploaded_file($this->filename, iconv('utf-8','gb2312',$filename))) {
   $this->error = 'upload write error';
   return false;
  }

会抛出异常:

SplFileobject::__construct(/upload\files\2019\04-16\资源.rar): failed to open stream: No such file or directory

解决:

上传中文乱码,使用iconv转码的,不应该在move_uploaded_file()中转码,应该在file类 buildSaveName()方法中大概422行中转码:

最后一段:

 return iconv('utf-8','gb2312',$savename);

那么如果大家是ajax上传,记得在返回的时候转成utf8返回,比如返回的中文乱码,ajax解析报错:

比如以Tp5.0是这样:

$return_data['url'] = '/'.UPLOAD_PATH.$new_path.iconv('gb2312','utf-8',$info->getSaveName());
$this->ajaxReturn($return_data);

总结

以上所述是小编给大家介绍的PHP 中move_uploaded_file 上传中文文件名失败 ,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对我们网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!

(0)

相关推荐

  • PHP中CheckBox多选框上传失败的代码写法

    用惯Java和其他语言的时候,表单上传只需要checkbox的name相同的时候就可以上传了 <input type="checkbox" name="checkbox" value="1"> 选项 <input type="checkbox" name="checkbox" value="2"> 选项 <input type="checkbox&

  • PHP中uploaded_files函数使用方法详解

    对PHP语言有些了解的朋友们都知道,它包含有功能强大的函数库.我们今天就一起来了解一下PHP uploaded_files函数的具体功能. 在早期的PHP版本中,上传文件很可能是通过如下的代码实现的: 复制代码 代码如下: -- if (isset($_FILES['file'])) { $tmp_name = $_FILES['file']['tmp_name']; } if (file_exists($tmp_name)) { copy($tmp_name,$destfile); } --

  • php上传大文件失败的原因及应对策略

    为什么上传大文件总是失败,但是上传小文件就没有问题.小编也不得其解,网上搜其原因,整理了一篇关于php上传大文件失败的原因和解决办法的文章,分享给大家. 下面分别是各种原因以及解决办法: 第1种情况:文件上传时存放文件的临时目录必须是开启的并且是 PHP 进程所有者用户可写的目录.如果未指定则 PHP 使用系统默认值. php.ini文件中upload_tmp_dir用来说明PHP上传的文件放置的临时目录,要想上传文件,得保证服务器没有关闭临时文件并对该文件夹有写入的权限. 第2种情况:max_

  • PHP move_uploaded_file() 函数(将上传的文件移动到新位置)

    定义和用法 move_uploaded_file() 函数将上传的文件移动到新位置. 若成功,则返回 true,否则返回 false. 语法 move_uploaded_file(file,newloc) 参数 描述 file 必需.规定要移动的文件. newloc 必需.规定文件的新位置. 说明 本函数检查并确保由 file 指定的文件是合法的上传文件(即通过 PHP 的 HTTP POST 上传机制所上传的).如果文件合法,则将其移动为由 newloc 指定的文件. 如果 file 不是合法

  • 解决PHP上传非标准格式的图片pjpeg失败的方法

    前一阵子网站新上了相册功能,可最近总发现有一些用户上传的图片文件链接失效,代码检查了很多次,测试也做的比较充分了,但还是会出现上传失败的问题,很是郁闷,今天终于找到了解决办法. 从备份源中找到了用户上传失败的JPG图片,进行上传测试,上传完成后页面提示: Warning: imagecreatefromjpeg(): '/tmp/lalala' is not a valid JPEG file in /path/upload.php on line 1 出现这个Warning是由于GD函数库检测

  • 浅析PHP 中move_uploaded_file 上传中文文件名失败

    项目需要上传文件名保持不变,发现上传中文失败:错误如下: move_uploaded_file(public/upload/files/2019/04-17/\开密二次开发.rar): failed to open stream: Invalid argument 失败的原因大致猜到是编码问题.保存文件时,需要将中文由utf8转为gb2312. <?php $files = $_FILES['attachment']; // 上传的表单附件名 $name = iconv("UTF-8&qu

  • Java中FTPClient上传中文目录、中文文件名乱码问题解决方法

    问题描述: 使用org.apache.commons.net.ftp.FTPClient创建中文目录.上传中文文件名时,目录名及文件名中的中文显示为"??". 原因: FTP协议里面,规定文件名编码为iso-8859-1,所以目录名或文件名需要转码. 解决方案: 1.将中文的目录或文件名转为iso-8859-1编码的字符.参考代码: 复制代码 代码如下: String name="目录名或文件名"; name=new String(name.getBytes(&qu

  • php上传中文文件名乱码问题处理方案

    php上传文件是最最基础的一个技术点,但是深入进去也有不少问题需要解决,这不,上传中文文件后,文件名变成了乱码. 下面是问题代码,很简单: 1.问题代码 html部分: 复制代码 代码如下: <html>  <body>  <form action="upload_file.php" method="post"  enctype="multipart/form-data">  <label for=&qu

  • ASP.NET中文件上传下载方法集合

    文件的上传下载是我们在实际项目开发过程中经常需要用到的技术,这里给出几种常见的方法,本文主要内容包括: 1.如何解决文件上传大小的限制 2.以文件形式保存到服务器 3.转换成二进制字节流保存到数据库以及下载方法 4.上传Internet上的资源 第一部分: 首先我们来说一下如何解决ASP.NET中的文件上传大小限制的问题,我们知道在默认情况下ASP.NET的文件上传大小限制为2M,一般情况下,我们可以采用更改WEB.Config文件来自定义最大文件大小,如下: <httpRuntime exec

  • 定制FileField中的上传文件名称实例

    FileField中的upload_to属性可以设定上传文件的存储目录和名称,它可以是个字符串,也可以是个callable,比如一个方法. 当upload_to的值设为一个方法时,就可以对上传文件的名称进行修改了.方法需要两个参数,instance与filename,instance为此FileField所属的Model实例,filename为上传文件的名称. 举例: def user_directory_path(instance, filename): # file will be uplo

  • 关于定制FileField中的上传文件名称问题

    FileField中的upload_to属性可以设定上传文件的存储目录和名称,它可以是个字符串,也可以是个callable,比如一个方法. 当upload_to的值设为一个方法时,就可以对上传文件的名称进行修改了.方法需要两个参数,instance与filename,instance为此FileField所属的Model实例,filename为上传文件的名称. 举例: def user_directory_path(instance, filename): # file will be uplo

  • Egg.js 中 AJax 上传文件获取参数的方法

    依赖 formidable 代码 前端 <fieldset style="margin: 20px; padding: 20px;"> <legend>单文件,Ajax</legend> <form id="form3"> <div> <input type="text" id="customName" placeholder="自定义文件名"

  • Java中多媒体文件上传及页面回显的操作代码

    文件上传页面 <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"&

  • 聊聊在Servlet中怎么上传文件

    首先对Servlet上传文件的简单理解 此前,Servlet本身没有对文件上传提供直接的支持,一般需要使用第三方框架来实现,这样就比较麻烦 不过,Servlet3.0之后提供了这个功能,而且使用非常简单,,为此,HTTPServletRequest提供了两个方法用于从请求中解析出上传的文件: Part getPart(String name) //获取请求中给定 name 的文件 Collection<Part> getParts() //获取所有的文件 其中每一个文件用一个javax.ser

  • Python中Selenium上传文件的几种方式

    目录 1. input 元素上传文件 2. input 元素隐藏 3. 文件选择对话框 4. 使用 pywinauto 上传文件 5. pyautogui 6. 并发问题 Selenium 封装了现成的文件上传操作.但是随着现代前端框架的发展,文件上传的方式越来越多样.而有一些文件上传的控件,要做自动化控制会更复杂一些,这篇文章主要讨论在复杂情况下,如何通过自动化完成文件上传. 1. input 元素上传文件 如果页面需要文件上传,那么在大多数情况下,都能在页面源代码中找到一个input的元素.

随机推荐