我有一个用Java编写的servlet,它接受多部分形式的发布文件,该文件需要保存在MongoDb / GridFS中。我已经有为此工作的代码。
这是一个代码片段,显示了如何使用org.apache.commons.fileupload包完成此操作。它几乎不占用内存,因为它不会在内存中保留太多数据。
        ServletFileUpload upload = new ServletFileUpload();
        FileItemIterator iter = upload.getItemIterator(req);
        while (iter.hasNext()) {
            FileItemStream item = iter.next();
            String name = item.getFieldName();
            InputStream stream = item.openStream();
            if (item.isFormField()) {
                toProcess.put(name, Streams.asString(stream));
            } else {
                String fileName = item.getName();
                String contentType = item.getHeaders().getHeader("Content-Type");
                GridFSUploadOptions options = new GridFSUploadOptions()
                        // .chunkSizeBytes(358400)
                        .metadata(new Document("content_type", contentType));
                ObjectId fileId = gridFSFilesBucket.uploadFromStream(fileName, stream, options);
                fileIds.add(fileId);
                fileNames.add(fileName);
            }
Run Code Online (Sandbox Code Playgroud)
我还需要计算所有文件的sha1哈希值。阿帕奇digestutils可以用于此目的。它具有一种可以计算流中的sha1的方法:
我的问题是此方法完全消耗了流。我需要将输入流分为两部分。将一部分输入到SHA-1计算中,另一部分输入到GridFS存储桶中。
我怎样才能做到这一点?我当时正在考虑创建自己的“管道”,该管道具有输入和输出流,可以转发所有数据,但可以实时更新摘要。
我只是不知道如何开始写这样的管道。
例如:
List<String> items = new ArrayList<String>();
String[] aItems = items.toArray(); // type error, because toArray() returns Object[]
Run Code Online (Sandbox Code Playgroud)
我知道这是它的方式,它不能改变.当然我可以将它转换为String [],但我想知道它背后的想法是什么?这是Java中的"bug",还是有充分的理由呢?
文档说可以使用 RTC.init 调用初始化 RTC 时钟。
https://docs.micropython.org/en/latest/esp8266/library/machine.RTC.html
但它不会那样工作:
>>>import machine
>>>rtc = machine.RTC()
>>>rtc.init((2018,4,10,17,30))
Traceback (most recent call last):
  File "<stdin>", line 1 in <module>:
AttributeError: 'RTC' object has no attribute 'init'
Run Code Online (Sandbox Code Playgroud)
所以文档与现实相矛盾。固件版本是 v1.9.3 - 几天前下载了最新的。
最有趣的是,dir(rtc)给出['datetime','memory','alarm','alarm_left','irq','ALARM0']. 它缺少其他几种方法:now、deinit、cancel
那么RTC init方法在哪里,它怎么会消失呢?
UPDATE:我已经想通了,该文件是错误的,我需要使用RTC.datetime代替RTC.init。但它仍然是错误的:
>>>from machine import RTC
>>>rtc=RTC()
>>>rtc.datetime((2000,1,1,23,59,59,0,0))
>>>rtc.datetime()
(2000, 1, 3, 0, 11, 59, 3, 705)
Run Code Online (Sandbox Code Playgroud)
换句话说:2000-01-01T23:59:59 突然变成了 2000-01-03T00:11:59。如何?
我在 RTC.datetime 方法的 tzinfo 参数上也找不到任何有用的东西。它应该是一个数字,这很清楚。但是这是什么意思?
我也试过午夜:
>>>rtc.datetime((2000,1,1,0,0,0,0,0))
>>>rtc.datetime()
(2000,1,1,5,0,0,1,155)
Run Code Online (Sandbox Code Playgroud)
因此,在 tzinfo=0 时,午夜变为 05:00:00。我首先认为这意味着 …
ResourceLoaderAPI文档中有一个类:
我想实现自己的加载器,因为我需要从数据库加载模板,但是以上下文敏感的方式(换句话说:无法使用 DataSourceResourceLoader,我需要编写自定义代码以从数据库)。
似乎ResourceLoader有一些抽象方法,而且我似乎也可以通过实现这些抽象方法来编写自定义加载器。但我没有看到任何方法可以向引擎添加新的加载程序。没有“addResourceLoader”方法。该文档仅显示如何配置 Velocity 中内置的加载器:
https://velocity.apache.org/engine/2.0/developer-guide.html#resource-loaders
主要问题:如何将自定义资源加载器添加到 VelocityEngine(或 VelocityContext?)
另一个附带问题:我想关闭所有内置加载器。特别WebappResourceLoader是它默认处于活动状态,并且在我的特定应用程序中代表了安全风险。怎么做?