FastDFS(四)玩个案例练练手
搭建图片服务器
Nginx模块安装 (Storage)
tar -zxvf fastdfs-nginx-module_v1.16.tar.gz
修改 config 文件,将文件中的 /usr/local/ 路径改为 /usr/
ngx_addon_name=ngx_http_fastdfs_module
HTTP_MODULES="$HTTP_MODULES ngx_http_fastdfs_module"
NGX_ADDON_SRCS="$NGX_ADDON_SRCS $ngx_addon_dir/ngx_http_fastdfs_module.c"
CORE_INCS="$CORE_INCS /usr/include/fastdfs /usr/include/fastcommon/"
CORE_LIBS="$CORE_LIBS -L/usr/lib -lfastcommon -lfdfsclient"
CFLAGS="$CFLAGS -D_FILE_OFFSET_BITS=64 -DFDFS_OUTPUT_CHUNK_SIZE='256*1024' -DFDFS_MOD_CONF_FILENAME='\"/etc/fdfs/mod_fastdfs.conf\"'"
修改 mod_fastdfs.conf
base_path=/home/fastdfs
tracker_server=IP:22122
#(n个tracker配置n行)
#tracker_server=10.1.220.x:22122
#url中包含group名称
url_have_group_name=true
#指定文件存储路径(上面配置的store路径)
store_path0=/home/fastdfs/fdfs_storage
将 libfdfsclient.so 拷贝至 /usr/lib 下
cp /usr/lib64/libfdfsclient.so /usr/lib/
创建nginx/client目录
mkdir -p /var/temp/nginx/client
Nginx安装 (Tracker)
进入nginx解压的目录下
安装
./configure \
--prefix=/usr/local/nginx \
--pid-path=/var/run/nginx/nginx.pid \
--lock-path=/var/lock/nginx.lock \
--error-log-path=/var/log/nginx/error.log \
--http-log-path=/var/log/nginx/access.log \
--with-http_gzip_static_module \
--http-client-body-temp-path=/var/temp/nginx/client \
--http-proxy-temp-path=/var/temp/nginx/proxy \
--http-fastcgi-temp-path=/var/temp/nginx/fastcgi \
--http-uwsgi-temp-path=/var/temp/nginx/uwsgi \
--http-scgi-temp-path=/var/temp/nginx/scgi \
--add-module=/usr/fastdfs-nginx-module/src
注意:上边将临时文件目录指定为 /var/temp/nginx,需要在 /var 下创建 temp 及 nginx 目录:mkdir /var/temp/nginx
编译:make
安装:make install
拷贝配置文件
cd /opt/FastDFS/conf
cp http.conf mime.types /etc/fdfs/
是否覆盖:yes
修改nginx配置文件
cd /usr/local/nginx/conf/
vim nginx.conf
server {
listen 80;
server_name IP;
#charset koi8-r;
#access_log logs/host.access.log main;
location /group1/M00 {
root /home/fastdfs/fdfs_storage/data;
ngx_fastdfs_module;
}
关闭nginx,并启动nginx
pkill -9 nginx
/usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf
搭建web服务
<packaging>war</packaging>
<dependencies>
<!-- 因为有jsp页面,所以引用servlet依赖-->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<scope>provided</scope>
<version>2.5</version>
</dependency>
<!-- 页面提交过来的请求,使用springmvc来处理-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.2.7.RELEASE</version>
</dependency>
<!-- java连接fastDFS的客户端工具-->
<dependency>
<groupId>net.oschina.zcx7878</groupId>
<artifactId>fastdfs-client-java</artifactId>
<version>1.27.0.0</version>
</dependency>
<!-- 图片上传到FastDFS需要用的到IO工具-->
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-io</artifactId>
<version>1.3.2</version>
</dependency>
<!-- 图片保存到web服务器需要用到的IO工具-->
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>1.3.1</version>
</dependency>
<!--用来转换java对象和json字符串,注意,2.7以上版本必须搭配spring5.0以上-->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.9.8</version>
</dependency>
</dependencies>
<form action="upload" method="post" enctype="multipart/form-data">
<input type="file" name="fname">
<br>
<button>提交</button>
</form>
<servlet>
<servlet-name>springMVC</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring/spring-mvc.xml</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>springMVC</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
<!--扫描注解包-->
<context:component-scan base-package="com.szx.controller"></context:component-scan>
<!--扫描控制器中的注解-->
<mvc:annotation-driven></mvc:annotation-driven>
<!--上传文件的解析器,规定上传文件的大小限制-->
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<!--限制上传文件最大 2G -->
<property name="maxUploadSize" value="2048000000"></property>
</bean>
##fastdfs-client.properties
fastdfs.connect_timeout_in_seconds = 5
fastdfs.network_timeout_in_seconds = 30
fastdfs.charset = UTF-8
fastdfs.http_anti_steal_token = false
fastdfs.http_secret_key = FastDFS1234567890
fastdfs.http_tracker_http_port = 80
fastdfs.tracker_servers = 106.75.245.83:22122
public class FlieSystem implements Serializable {
private String filrId;
private String filePath;
private String fileName;
public FlieSystem() {
}
public FlieSystem(String filrId, String filePath, String fileName) {
this.filrId = filrId;
this.filePath = filePath;
this.fileName = fileName;
}
public String getFilrId() {
return filrId;
}
public void setFilrId(String filrId) {
this.filrId = filrId;
}
public String getFilePath() {
return filePath;
}
public void setFilePath(String filePath) {
this.filePath = filePath;
}
public String getFileName() {
return fileName;
}
public void setFileName(String fileName) {
this.fileName = fileName;
}
@Override
public String toString() {
return "FlieSystem{" +
"filrId='" + filrId + '\'' +
", filePath='" + filePath + '\'' +
", fileName='" + fileName + '\'' +
'}';
}
}
@Controller
public class FileAction {
/**
* MultipartHttpServletRequest:是HttpServletRequest的强化版,不仅可以装文本,还以装文件图片信息
* @param request
* @return 上传文件对象的json对象
* @throws Exception
* 上传流程:
* 先把文件保存在web服务器
* 在从web服务器上将文件上传到FastDFS上
*/
@RequestMapping("upload")
@ResponseBody
public FlieSystem upload(MultipartHttpServletRequest request) throws Exception{
//自定义返回实体类
FlieSystem fileSystem = new FlieSystem();
//在页面请求中获取上传文件对象
MultipartFile file = request.getFile("fname");
//获取文件原始名
String oldFileName = file.getOriginalFilename();
//获取后缀名
String hou = oldFileName.substring(oldFileName.lastIndexOf(".") + 1);
//创建新的文件名
String newFileName = UUID.randomUUID().toString() + "." + hou;
//创建web服务器保存文件的目录
File toSaveFile = new File("E:\\upload\\" + newFileName);
//将路径转换成文件
file.transferTo(toSaveFile);
//获取服务器绝对路径
String newFilePath = toSaveFile.getAbsolutePath();
//加载配置文件
ClientGlobal.initByProperties("config/fastdfs-client.properties");
//创建tracker客户端
TrackerClient trackerClient = new TrackerClient();
//通过客户端获取tracker的连接服务并返回
TrackerServer trackerServer = trackerClient.getConnection();
//声明storage服务
StorageServer storageServer = null;
//定义storage客户端
StorageClient1 client = new StorageClient1(trackerServer, storageServer);
//获取元信息
NameValuePair[] list = new NameValuePair[1];
list[0] = new NameValuePair("fileName",oldFileName);
//上传
String fileId = client.upload_appender_file1(newFilePath, hou, list);
//关闭流
trackerServer.close();
//封装返回数据
fileSystem.setFilrId(fileId);
fileSystem.setFileName(oldFileName);
//已经上传到fastDFS,通过fileId来访问图片
fileSystem.setFilePath(fileId);
return fileSystem;
}
}